iOS 宏 #if 判断条件中可以使用枚举值吗?
2017-02-28 本文已影响409人
zhangyin
不能
因为预编译发生在枚举定义之前,当进行预编译时,枚举还没有在系统中定义出来;
C源码编译分为以下过程:源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件。
宏定义是在预编译时直接进行替换。而枚举值要在编译时才能确定其值。所以任何在宏定义中引用枚举值的操作都是错误的
举个栗子
例如,在一个头文件中(Definition.h),定义了一个枚举:
typedef NS_ENUM(NSInteger,PushType) {
PushType_APNS = 0,
PushType_Socket = 1
};
在Definition.h中编写一个宏语句,让CPushType的值为PushType_Socket
//理想很丰满,现实很骨感
#define CPushType PushType_Socket
然后,在Definition.h文件中编写以下条件语句:
#if (CPushType == PushType_APNS)
#define PushName @"APNS"
#else
#define PushName @"Socket"
#endif
接下来在代码中验证一下
NSLog(@"pushName:%@",PushName);
//pushName:APNS
PushName的值始终为:"APNS"
在进行预编译时, ** #define CPushType PushType_Socket **
由于枚举还没定义出来,所以 PushType_Socket的值为0,CPushType的值也为0,
因此,** #if (CPushType == PushType_APNS) ** 相当于:** #if (0 == 0) **