在宏中展开宏

Expanding macro within macro

本文关键字:      更新时间:2023-10-16

在下面的例子中,我希望看到

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

您可以很容易地看到预处理器在做什么。例如,对于gcc(g++),您可以使用"-E"选项来查看预处理器正在生成什么。在你的情况下,你得到的是:

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

我相信,这不是你所期望的。然而,如果您从HUTAssert(#expr)中去掉#,即"字符串化"您的令牌,我相信它将接近您所期望的

相关文章:
  • 没有找到相关文章