2016-07-29 15 views
1

Im folgende Beispiel erwarte ichErweiterung Makro innerhalb Makro

doSomething 
asserting in "doSomething()" 

zu sehen, aber ich jede Ausgabe auf der Konsole nicht sehen.

Wenn ich HUTAssert (doSomething()) in main(), ich sehe den erwarteten Ausgang, so dass ich erwarte, dass dies in einem anderen Makro

mit aufwendet ein Makro zu tun hat
#include <iostream> 
using namespace std; 
#define LOPTAssertEnabled 1 
#define HUTAssert(expr) ((expr)? (void(0)) : assertMe(#expr)) 
#define HAOPAssert(expr) ((isLOPTAssertEnabled())? HUTAssert(#expr) : void(expr)) 
void assertMe(char const* expr) { 
    std::cout <<" asserting in "<<expr; 
} 
bool doSomething() { 
    std::cout <<" did something "<<std::endl; 
    return false; 
} 

bool isLOPTAssertEnabled() { 
    return LOPTAssertEnabled; 
} 

int main() { 
    HAOPAssert(doSomething()); 
} 
+0

Sie scheinen zu wissen, was "# expr" tut. Was erwarten Sie von 'HUTAssert (#expr)'? – chris

Antwort

4

Sie leicht, was sehen Präprozessor macht. Zum Beispiel können Sie mit gcc (g ++) die Option "-E" verwenden, um zu sehen, was der Präprozessor produziert. In Ihrem Fall erhalten Sie dies:

void assertMe(char const* expr) { 
    std::cout <<" asserting in "<<expr; 
} 

bool doSomething() { 
    std::cout <<" did something "<<std::endl; 
    return false; 
} 

bool isLOPTAssertEnabled() { 
    return 1; 
} 

int main() { 
    ((isLOPTAssertEnabled())? (("doSomething()")? (void(0)) : 
      assertMe("\"doSomething()\"")) : void(doSomething())); 
} 

Ich glaube, das ist nicht das, was Sie erwarten. Jedoch, wenn Sie # abstreifen, die Ihr Token "stringfying", von HUTAssert(#expr) ist, glaube ich, dass es nah ist, was Sie erwarten