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

Mutiline macro statement that includes pre-processor directives

本文关键字:语句 预处理 指令 包含      更新时间:2023-10-16

我试图定义一个宏,其中包括一个预处理器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总是这样做的首选方式吗?

是的,选项二就是这样做的方法。正如您可能发现的那样,选项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就是不起作用。最接近的方法是定义依赖于ifdefs的具有多个定义的宏,正如在选项2中所做的那样。您可以做的一件事是定义一个宏,它只扩展到它的参数或不扩展,具体取决于ifdefs:

#ifdef _DEBUG
#define IF_DEBUG(...)    __VA_ARGS__
#else
#define IF_DEBUG(...)
#endif

现在您可以在其他宏中使用这个宏:

#define MY_MACRO    IF_DEBUG( MyFunction() )