Code Bye

问一下枚举和宏定义可以这样用吗

enum E
{
  A,
  B,
}
#define DEF A
#if DEF == A
// 定义一些代码
#elif DEF == B
// 定义另外一些代码
#endif

问一下可以用上面这样的代码,通过配置DEF后面是A或是B来控制不同的执行代码吗?

解决方案

10

不可以。
预编译发生在编译之前,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源代码中处理宏和处理枚举相关源代码片断。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明问一下枚举和宏定义可以这样用吗