C ++结合#define和#ifndef宏

时间:2014-07-15 14:53:16

标签: c++ macros

我想知道是否有办法合并#define和#ifndef宏..

这意味着我想在#define宏中使用#ifndef宏。

由于它很难解释,这是我想要做的一个例子:

#define RUN_IF_DEBUG                \
    #ifndef DEBUG_MODE              \
        ;      // do nothing        \
    #else                           \
        cout << "Run!" << endl;     \
    #endif

int main() {
    RUN_IF_DEBUG
}

所以我希望 RUN_IF_DEBUG 宏只在定义 DEBUG_MODE 的情况下运行...

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:5)

通常以相反的方式完成:

#ifndef DEBUG_MODE
#  define RUN_IF_DEBUG ;
#else
#  define RUN_IF_DEBUG cout << "Run!" << endl;
#endif

答案 1 :(得分:2)

简单地做

#ifndef DEBUG_MODE
    #define RUN_IF_DEBUG ;      // do nothing
#else
    #define RUN_IF_DEBUG cout << "Run!" << endl;
#endif

您不能将其他预处理程序语句放在宏的主体中。

来自c++ standards definitions 草案部分

  

16个预处理指令

     

...
  控制线:
  ...
  # define 标识符替换列表换行符   # define 标识符 lparen identifier-listopt)replacement-list new-line
  # define 标识符 lparen ...)replacement-list new-line
  # define 标识符 lparen identifier-list,...)replacement-list new-line

这些是#define语句的允许语法变体。

`

答案 2 :(得分:0)

问题是宏中的行继续。他们所做的是将所有内容放在一行上,因此扩展的宏看起来像

int main() {
    #ifndef DEBUG_MODE ; #else cout ...; #endif
}

这对预处理器或编译器不起作用。

相反,你应该切换嵌套,首先使用#ifndef,然后使用#define内层的宏。