假设我有这段代码:
#define NAME MY_APP
#define ENABLE NAME ## _ENABLE
我想检查ENABLE
扩展到的宏是否已定义,即是否定义了MY_APP_ENABLE
。这是否可以使用 C 宏?
答案 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