【发布时间】:2015-01-28 08:25:19
【问题描述】:
给定:
#define TRACE(x) do { if (DEBUG) dbg_print x; } while (0)
我想要:
TRACE((
"Message: %s"
#ifdef MYDEF
"Additional stuff"
#endif
, msg));
但是报错:
error C2121: '#' invalid character : possibly the result of a macro expansion
error C2146: syntax error : missing ')' before identifier 'ifdef'
error C2121: '#' invalid character : possibly the result of a macro expansion
error C2059: syntax error : ')'
我知道我可以通过编写两个不同的TRACE 调用并使用#ifdef...#else...#endif 轻松解决此问题,但以上只是一个简化的情况。我的实际用例涉及多个控制格式字符串和参数的#ifdef,因此编写多个跟踪调用是不切实际的(例如,使用 3 个ifdef,我需要 2^3 = 8 个不同的调用来处理所有可能的组合)。有没有办法解决这个问题?
【问题讨论】:
-
应该是
dbg_print(x) -
@BasileStarynkevitch 不,那不是他正在做的事情(见调用,他在那里传递了函数调用的括号)。
-
这根本不可能。
-
@Axalo 它不是可移植的,但它是可能的。还有一个解决不可移植性的方法。
-
能否将 TRACE() 宏转换为静态内联函数?
标签: c syntax c-preprocessor preprocessor-directive