包含预处理程序指令的多行宏语句

时间:2014-03-26 03:36:33

标签: c++ debugging macros c-preprocessor

我正在尝试定义一个宏,其中包含一个预处理器if语句,用于检查其体内的DEBUG状态。基本上,这就是我想要实现的目标:

选项1

#define MY_MACRO  { \
                    #ifdef _DEBUG \
                         MyFunction(); \
                    #endif \
                  }

我知道另一种实现如下:

选项2

#ifdef _DEBUG
   #define MY_MACRO  MyFunction();
#else
   #define MY_MACRO
#endif

所以,我有两个问题:

  1. 上面的选项1是否正确实施?如果没有,那么正确的方法是什么 这样做?
  2. 选项2是否始终是首选方式?

2 个答案:

答案 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() )