首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在宏内展开宏

在宏内展开宏
EN

Stack Overflow用户
提问于 2016-07-29 08:56:54
回答 1查看 72关注 0票数 1

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

代码语言:javascript
复制
 doSomething 
 asserting in "doSomething()"

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

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

代码语言:javascript
复制
#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());
}
EN

回答 1

Stack Overflow用户

发布于 2016-07-29 09:09:13

您可以很容易地看到预处理器正在做什么。例如,对于gcc (g++),您可以使用"-E“选项来查看预处理器正在生成什么。在你的例子中,你会得到这样的结果:

代码语言:javascript
复制
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)中去掉#,我相信它将接近您的期望

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38648933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档