enum E { A, B, } #define DEF A #if DEF == A // 定义一些代码 #elif DEF == B // 定义另外一些代码 #endif
问一下可以用上面这样的代码,通过配置DEF后面是A或是B来控制不同的执行代码吗?
解决方案
10
不可以。
预编译发生在编译之前,enum E 的定义根本不会被处理。
预编译里能够替换的只有 define 。
在 #if 之后,全部不能通过 #define 被替换为字面量的标识符和关键字都会被替换为0。
预编译发生在编译之前,enum E 的定义根本不会被处理。
预编译里能够替换的只有 define 。
在 #if 之后,全部不能通过 #define 被替换为字面量的标识符和关键字都会被替换为0。
#define DEF A #if DEF == A // 定义一些代码 #elif DEF == B // 定义另外一些代码 #endif
会变成
#define DEF A #if 0 == 0 // 定义一些代码 #elif 0 == 0 // 定义另外一些代码 #endif
无论你把 DEF #define 成 A B C D … ,都是一样的。
========================
一下是可以的:
#define DEF 1 #if DEF == 1 // 定义一些代码 #elif DEF == 2 // 定义另外一些代码 #endif
6
楼上说的对,预编译阶段时还不会处理你的enum,所以无论你宏怎么定义,执行的都是#if DEF == A 片断代码
3
显然是不行的,预处理指令只处理那些 # 开头的行,而且一切判断都必须是字面值或宏名称,A、B 这些枚举值对于预处理器来说只是一些文字而已,根本还没有到语法解析层面。
4
参考gcc源代码中处理宏和处理枚举相关源代码片断。