我正在尝试定义一个宏,其中包含一个预处理器if语句,用于检查其体内的DEBUG状态。基本上,这就是我想要实现的目标:
选项1
#define MY_MACRO { \
#ifdef _DEBUG \
MyFunction(); \
#endif \
}
我知道另一种实现如下:
选项2
#ifdef _DEBUG
#define MY_MACRO MyFunction();
#else
#define MY_MACRO
#endif
所以,我有两个问题:
答案 0 :(得分:1)
是的,选项二是这样做的方法。正如您可能发现的那样,选项1不起作用。您应该删除替换中的尾随;
:
#define MY_MACRO MyFunction()
否则,如果有人写道:
if (condition)
MY_MACRO;
else
do_something_else();
替代产生:
if (condition)
MyFunction();;
else
do_something_else();
...并且两个分号告诉编译器if
语句终止并且后跟一个空语句,然后出现意外且非法的else
。
根据具体情况,最好有:
#define MY_MACRO() MyFunction()
所以调用代码如下:
MY_MACRO();
这与函数调用更加一致。
答案 1 :(得分:1)
没有办法将宏扩展到任何类型的预处理器指令,因此选项1不起作用。最接近的是定义具有多个定义的宏,具体取决于ifdef,正如您在选项2中所做的那样。您可以做的一件事是定义一个宏,它只是扩展为它的参数或什么都不是,取决于ifdefs:< / p>
#ifdef _DEBUG
#define IF_DEBUG(...) __VA_ARGS__
#else
#define IF_DEBUG(...)
#endif
现在您可以在其他宏中使用此宏:
#define MY_MACRO IF_DEBUG( MyFunction() )