代码之家  ›  专栏  ›  技术社区  ›  Evan DiBiase

值为字符串的枚举的类型是什么?

  •  14
  • Evan DiBiase  · 技术社区  · 17 年前

    我在苹果公司工作 ScriptingBridge enum 是这样的:

    typedef enum {
        iTunesESrcLibrary = 'kLib',
        iTunesESrcIPod = 'kPod',
        iTunesESrcAudioCD = 'kACD',
        iTunesESrcMP3CD = 'kMCD',
        iTunesESrcDevice = 'kDev',
        iTunesESrcRadioTuner = 'kTun',
        iTunesESrcSharedLibrary = 'kShd',
        iTunesESrcUnknown = 'kUnk'
    } iTunesESrc;
    

    枚举 枚举 值作为整数(在 NSPredicate ,例如)没有做正确的事情。

    我添加了 将上述声明转换为带有空 main 函数,并使用 i686-apple-darwin9-gcc-4.0.1 s可能不符合C标准(正如Parapa在下面指出的),它们至少被编译为 一些

    4 回复  |  直到 16 年前
        1
  •  18
  •   Christoph    17 年前

    C99,TC3的内容如下:

    整数字符常量是一个 一个或多个

    整数字符常量的类型为int。包含映射到单字节执行字符的单个字符的整数字符常量的值是被解释为整数的映射字符表示形式的数值。包含多个字符(例如,“ab”)的整型字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的整型字符常量的值,由实现定义。如果整型字符常量包含单个字符或转义序列,则其值是将char类型的对象(其值为单个字符或转义序列的值)转换为int类型时产生的值。

    在大多数实现中,使用最多4个单字节字符的整数字符常量是安全的。但是,不同系统之间的实际值可能不同(endianness?)。


    这实际上已经在ANSI-C89标准第3.1.3.4节中定义:

    整数字符常量是一个或多个字符的序列 用单引号括起来的多字节字符,如“x”或“ab”。[...]

    整数字符常量,包含映射的单个字符 进入基本执行字符集的一个成员是数字 被解释为 整数包含多个字符的整数字符常量的值 多个字符,或包含字符或转义序列 在基本执行字符集中表示为 实现定义。特别是在一个实现中 类型char的值范围与带符号char(高阶)的值范围相同 单个字符整型字符常量的位位置为 被视为符号位。

        2
  •  6
  •   Steve Fallows    17 年前

    单引号表示字符,而不是C中的字符串。因此,每个枚举都有一个32位的值,由四个字符的字符代码组成。实际值取决于字符编码,但我假设为8位字符。注意有 不 追加\0。

    您可以将枚举用于正常比较/分配目的。与任何枚举一样,基础类型为整数。

    我已经在嵌入式系统中多次使用这种技术来创建4个字符的“名称”,这些名称在十六进制转储/调试器上下文中是人类可读的。

        3
  •  2
  •   Andy Dent    17 年前

    如前所述,这些是使用字符常量声明的整数。

    当使用多个字符的字符常量声明整数时,它对 byte order 为其开发常数的机器。由于所有原始的Mac API都在PPC或更早的机器上,因此它们与Intel相比是落后的 Little-Endian 机器。

    如果你只为英特尔公司做产品,你可以手工改变订单。

    如果要构建通用二进制文件,则需要使用 flipping function 例如 CFSwapInt32BigToHost

    如果无法更正这些代码,那么不管编译器是否存在错误,您将得到只能在PowerPC机器上工作的代码。

        4
  •  0
  •   codelogic    17 年前

    这是苹果对C语言的一个扩展

    typedef enum {
        iTunesESrcLibrary = 'k'<<24 | 'L'<<16 | 'i'<<8 | 'b',
     ...
     }
    

    编辑:对不起,很明显这是有效的C。我只在Mac代码中看到过,所以错误地认为这是苹果特有的。

    推荐文章