检查宏内宏的定义

时间:2015-04-27 09:56:27

标签: c macros c-preprocessor

假设我有这段代码:

#define NAME MY_APP
#define ENABLE NAME ## _ENABLE

我想检查ENABLE扩展到的宏是否已定义,即是否定义了MY_APP_ENABLE。这是否可以使用 C 宏?

2 个答案:

答案 0 :(得分:2)

没有。特别是建议的

#ifdef NAME ## _ENABLE
根据 6.10.3.4重新扫描和进一步替换

无效,

  

生成的完全宏替换的预处理标记序列不会被重新处理为预处理指令,即使它类似于1,但是其中的所有编译指示一元运算符表达式都会按照下面的6.10.9中的规定进行处理。

答案 1 :(得分:1)

您可以使用构造defined来检查是否定义了宏,但只能在预处理器表达式中使用它。可以编写一个扩展到此构造的宏。例如:

#define MY_APP_ENABLED

#define IS_DEFINED(x) defined(x ## _ENABLED)

#if IS_DEFINED(MY_APP)
#error "YES"
#else
#error "NO"
#endif

以上将在编译时发出YES。如果未定义MY_APP_ENABLED,则会发出NO

更新:当NAME定义为MY_APP时,以下版本将有效。额外的间接级别允许NAME在与MY_APP连接之前扩展到_ENABLED

#define MY_APP_ENABLED

#define IS_DEFINED0(x) defined(x ## _ENABLED)
#define IS_DEFINED(x) IS_DEFINED0(x)

#define NAME MY_APP

#if IS_DEFINED(NAME)
#error "YES"
#else
#error "NO"
#endif