我有以下预处理器指令:
#ifndef NDEBUG
#define TRACE printf
#else
#define TRACE(...)
#endif
使用示例是:
TRACE("TRACE: some parameter = %i\n", param);
在 C 中,当我构建调试和发布版本时,一切都运行得很好,但在 C++ 编译器中会发出以下内容:
警告:宏参数名称中的字符无效
错误:‘#define’中的参数列表标点错误
并将这些警告和错误指向“TRACE(...)”指令。
如何用 C++ 正确编写此代码?
最佳答案
#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 中
[编辑] - 使用||保证不评估
关于c++ - #define TRACE(...) 在 C++ 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/166083/