在宏内扩展宏

时间:2016-07-29 00:56:54

标签: c++

在以下示例中,我希望看到

 doSomething 
 asserting in "doSomething()"

但是我在控制台上看不到任何输出。

当我在main()中使用HUTAssert(doSomething())时,我看到了预期的输出,所以我希望这与在另一个宏中扩展宏有关

#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());
}

1 个答案:

答案 0 :(得分:4)

您可以轻松查看预处理器正在执行的操作。例如,使用gcc(g ++),您可以使用&#34; -E&#34;用于查看预处理器正在生成的选项。在你的情况下,你得到这个:

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()));
}

我相信,这不是你所期待的。但是,如果你剥离#,那就是&#34; stringfying&#34;你的令牌来自HUTAssert(#expr),我相信它会接近你所期待的