在带有宏的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()永远不会被调用,因为这个调用会被预处理器删除。
有没有一种方法可以使用内联函数(可以在名称空间中)或类似的函数代替宏来获得类似的效果?
发布于 2016-10-07 16:31:34
你将不能以同样的方式和同样的效率使用它。这是因为以同样的方式使用它会导致您的函数总是被调用,但不会将其传递给cout。
为了避免这样做,您必须传递函数指针(或std::function / lambda表达式)以获得相同的效率;但如果您愿意这样做,您可以创建一个类似如下的模板函数
template<typename T>
log(T x) {
#ifndef NDEUBG
cout << x << endl;
#endif
}然后专门针对函数。
发布于 2016-10-07 16:32:54
AFAIK代码本身不知道任何关于定义和预处理器的东西。您需要在预处理器阶段检查定义。
所以你可以做这样的事情。要摆脱#ifdefs是不可能的
#ifndef NDEBUG
Debug(const std::string& str) {std::cerr << "Debug: " << str << std::endl;}
#else
Debug(const std::string&) {}
#endifhttps://stackoverflow.com/questions/39912684
复制相似问题