定义内联无操作功能,以便不对参数进行评估

时间:2016-10-07 08:21:42

标签: c++ macros namespaces

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

#ifndef NDEBUG
#define Debug(__str__) std::cerr << "Debug: " << (__str__) << std::endl;
#else
#define Debug(__str__) (void)0
#endif

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

Debug(generate_state_description());

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

有没有办法使用内联函数(可以在命名空间中)或类似函数而不是宏来获得类似的效果?

2 个答案:

答案 0 :(得分:1)

您将无法以相同的效率使用它。这是因为以相同的方式使用它会导致您的函数始终被调用,但之后只是不将它传递给cout。

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

的模板功能
template<typename T>
log(T x) {
  #ifndef NDEUBG
    cout << x << endl;
  #endif
}

然后专注于功能。

答案 1 :(得分:0)

AFAIK代码本身对定义和预处理器的东西一无所知。您需要在预处理器阶段检查定义。

所以你可以做那样的事情。摆脱#ifdefs

是不可能的
#ifndef NDEBUG
Debug(const std::string& str) {std::cerr << "Debug: " << str << std::endl;}
#else
Debug(const std::string&) {}
#endif