【发布时间】:2015-04-27 09:56:27
【问题描述】:
假设我有这个代码:
#define NAME MY_APP
#define ENABLE NAME ## _ENABLE
我想检查 ENABLE 扩展为的宏是否已定义,即 MY_APP_ENABLE 是否已定义。这可以使用 C 宏吗?
【问题讨论】:
-
让你的问题更简单不易理解
标签: c macros c-preprocessor
假设我有这个代码:
#define NAME MY_APP
#define ENABLE NAME ## _ENABLE
我想检查 ENABLE 扩展为的宏是否已定义,即 MY_APP_ENABLE 是否已定义。这可以使用 C 宏吗?
【问题讨论】:
标签: c macros c-preprocessor
您可以使用构造 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 在与_ENABLED 连接之前扩展为MY_APP:
#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
【讨论】:
没有。特别是建议
#ifdef NAME ## _ENABLE
将不起作用,根据 6.10.3.4 重新扫描和进一步替换,它说
生成的完全被宏替换的预处理标记序列即使类似于一个预处理指令也不会被重新处理,但其中的所有 pragma 一元运算符表达式随后会按照下面 6.10.9 中的规定进行处理。
【讨论】: