iOS开发小抄

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) **


上一篇下一篇

猜你喜欢

热点阅读