#define TRACE(...)在C ++中不起作用

时间:2008-10-03 09:30:34

标签: c++

我有以下预处理器转移:

#ifndef NDEBUG
#define TRACE printf
#else
#define TRACE(...)
#endif

用法的例子是:

TRACE("TRACE: some parameter = %i\n", param);

在C中,当我构建调试版和发行版时,它们都能很好地工作,但在C ++编译器中会发出以下内容:

警告:宏参数名称中的字符无效

错误:在`#define'

中严重打断参数列表

并将这些警告和错误指向'TRACE(...)'指令。

如何正确地用C ++编写?

3 个答案:

答案 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对该代码没有任何问题。