#define TRACE(...)在C ++中不起作用
时间:2020-03-06 15:03:57 来源:igfitidea点击:
我具有以下预处理器剥离功能:
#ifndef NDEBUG #define TRACE printf #else #define TRACE(...) #endif
用法示例是:
TRACE("TRACE: some parameter = %i\n", param);
在C中,当我同时构建调试版本和发行版时,一切工作都很好,但是在C ++中,编译器发出以下信息:
警告:宏参数名称中的字符无效
错误:`#define'中的标点符号不正确
并将这些警告和错误指向'TRACE(...)'指令。
如何用C ++正确编写呢?
解决方案
我们可以这样做:
inline void TRACE(...) {}
什么编译器?就其价值而言,G ++ 4.3.1对该代码没有任何问题。
#define TRACE false ||
这会将TRACE(x,y,z)转换为false ||。 (x,y,z)。由于x,y和z将是表达式,因此(x,y,z)的计算结果为z(逗号运算符)。 z必须是内置类型(合法地传递给printf样式的函数),因此它在||的右侧有效。它不会被评估,但它必须是一个合法的表达式(例如,我们不能引用仅存在于DEBUG版本中的类成员)
Vararg宏是C99的发明,它们不在C ++ 98中,但很可能在C ++ 0x中
[编辑]使用||保证不被评估