#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中

[编辑]使用||保证不被评估