美文网首页iOS开发小抄
iOS 宏 #if 判断条件中可以使用枚举值吗?

iOS 宏 #if 判断条件中可以使用枚举值吗?

作者: zhangyin | 来源:发表于2017-02-28 12:27 被阅读409次

    不能
    因为预编译发生在枚举定义之前,当进行预编译时,枚举还没有在系统中定义出来;
    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) **


    相关文章

      网友评论

        本文标题:iOS 宏 #if 判断条件中可以使用枚举值吗?

        本文链接:https://www.haomeiwen.com/subject/xwrxgttx.html