首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定义内联no-op函数,这样就不会对参数求值

定义内联no-op函数,这样就不会对参数求值
EN

Stack Overflow用户
提问于 2016-10-07 16:21:42
回答 2查看 88关注 0票数 1

在带有宏的C++中,我可以创建一个宏,如:

代码语言:javascript
复制
#ifndef NDEBUG
#define Debug(__str__) std::cerr << "Debug: " << (__str__) << std::endl;
#else
#define Debug(__str__) (void)0
#endif

在部署代码中(设置了NDEBUG ),在调用

代码语言:javascript
复制
Debug(generate_state_description());

函数generate_state_description()永远不会被调用,因为这个调用会被预处理器删除。

有没有一种方法可以使用内联函数(可以在名称空间中)或类似的函数代替宏来获得类似的效果?

EN

回答 2

Stack Overflow用户

发布于 2016-10-07 16:31:34

你将不能以同样的方式和同样的效率使用它。这是因为以同样的方式使用它会导致您的函数总是被调用,但不会将其传递给cout。

为了避免这样做,您必须传递函数指针(或std::function / lambda表达式)以获得相同的效率;但如果您愿意这样做,您可以创建一个类似如下的模板函数

代码语言:javascript
复制
template<typename T>
log(T x) {
  #ifndef NDEUBG
    cout << x << endl;
  #endif
}

然后专门针对函数。

票数 1
EN

Stack Overflow用户

发布于 2016-10-07 16:32:54

AFAIK代码本身不知道任何关于定义和预处理器的东西。您需要在预处理器阶段检查定义。

所以你可以做这样的事情。要摆脱#ifdefs是不可能的

代码语言:javascript
复制
#ifndef NDEBUG
Debug(const std::string& str) {std::cerr << "Debug: " << str << std::endl;}
#else
Debug(const std::string&) {}
#endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39912684

复制
相关文章

相似问题

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