我有以下预处理器转移:
#ifndef NDEBUG
#define TRACE printf
#else
#define TRACE(...)
#endif
用法的例子是:
TRACE("TRACE: some parameter = %i\n", param);
在C中,当我构建调试版和发行版时,它们都能很好地工作,但在C ++编译器中会发出以下内容:
警告:宏参数名称中的字符无效
错误:在`#define'
中严重打断参数列表并将这些警告和错误指向'TRACE(...)'指令。
如何正确地用C ++编写?
答案 0 :(得分:3)
#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中
[edit] - 使用||保证不评估
答案 1 :(得分:1)
你可以这样做:
inline void TRACE(...) {}
答案 2 :(得分:0)
什么编译器?对于它的价值,G ++ 4.3.1对该代码没有任何问题。