在带有宏的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()
,因为预处理器会删除调用。
有没有办法使用内联函数(可以在命名空间中)或类似函数而不是宏来获得类似的效果?
答案 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