• NS_ENUM 和 NS_OPTIONS的区别


    在苹果的一篇官方文档《Adopting Modern Objective-C》“适应现代的Objectice-c”中提及到使用NS_ENUM和NS_OPTIONS来声明枚举

    NS_ENUM用来声明基于一般整形的枚举,而NS_OPTIONS一般用来声明基于位掩码的声明(bitmask)

    在一般的教程书中也经常提及,但是其中的区别是什么呢?

    在NSObjCRuntime.h中有如下的宏定义

    [cpp] view plain copy
    1. #define NS_ENUM(_type, _name) CF_ENUM(_type, _name)  
    [cpp] view plain copy
    1. #define NS_OPTIONS(_type, _name) CF_OPTIONS(_type, _name)  

    就是说,NS_ENUM 、CF_ENUM是一样的,NS_OPTIONS、CF_OPTIONS是一样的

    那再具体分析下CF_ENUM,CF_OPTIONS宏到底是什么东西

    在CF_ENUM,CF_OPTIONS宏定义头文件CFAvailability.h中有如下的宏定义

    [cpp] view plain copy
    1. #if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))  
    2.     #define CF_ENUM(_type, _name) enum _name : _type _name; enum _name : _type  
    3.     #if (__cplusplus)  
    4.         #define CF_OPTIONS(_type, _name) _type _name; enum : _type  
    5.         #else  
    6.         #define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type  
    7.     #endif  
    8. #else  
    9.     #define CF_ENUM(_type, _name) _type _name; enum  
    10.     #define CF_OPTIONS(_type, _name) _type _name; enum  
    11. #endif  


    诈一看,其实两者基本思想是没有区别的,并没有说NS_ENUM枚举的元素非得是整型,NS_OPTIONS枚举的元素非得是与位有关的,据其根本

    枚举的目的是为整型数据添加一个名字罢了。NS_ENUM,NS_OPTIONS只是为了代码的统一性,约束一下编码规则罢了。


    但是,仔细看的又会发现有不同,为什么有时候将宏定义为#define CF_OPTIONS(_type, _name) _type _name; enum : _type或者#define CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type

    StackOverflow 里面这个问题说到,但是前面几个回答似乎有点简单,没有说到重点,最后那个回到似乎很有道理

    具体是说因为c++11支持了枚举的向前声明(forward declare),因而出现的bug,为兼容使用到了类如“CF_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type”

  • 相关阅读:
    交叉熵的数学原理及应用——pytorch中的CrossEntropyLoss()函数
    pytorch中如何使用DataLoader对数据集进行批处理
    Pytorch中的自动求导函数backward()所需参数含义
    Pytorch中的torch.cat()函数
    Pytorch中的squeeze()和unsqueeze()函数
    UBUNTU18.04安装网易云音乐并直接图标启动
    UBUNTU18.4环境下使用更好用的搜索引擎(无奈,只能起这样的标题)
    Ubuntu 18.04换国内源 中科大源 阿里源 163源 清华源
    共享栈
    C++(十七) — 宏代码、内联函数
  • 原文地址:https://www.cnblogs.com/wangguimin/p/6229329.html
Copyright © 2020-2023  润新知