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

C 值为字符串的枚举的类型是什么?,c,cocoa,enums,scripting-bridge,C,Cocoa,Enums,Scripting Bridge,我正在使用苹果的ScriptingBridge框架,并为iTunes生成了一个头文件,其中包含几个enums,如下所示: typedef enum { iTunesESrcLibrary = 'kLib', iTunesESrcIPod = 'kPod', iTunesESrcAudioCD = 'kACD', iTunesESrcMP3CD = 'kMCD', iTunesESrcDevice = 'kDev', iTunesESrcRadioT

我正在使用苹果的
ScriptingBridge
框架,并为iTunes生成了一个头文件,其中包含几个
enum
s,如下所示:

typedef enum {
    iTunesESrcLibrary = 'kLib',
    iTunesESrcIPod = 'kPod',
    iTunesESrcAudioCD = 'kACD',
    iTunesESrcMP3CD = 'kMCD',
    iTunesESrcDevice = 'kDev',
    iTunesESrcRadioTuner = 'kTun',
    iTunesESrcSharedLibrary = 'kShd',
    iTunesESrcUnknown = 'kUnk'
} iTunesESrc;
我的理解是,
enum
值必须是类似整数的,但这个定义似乎违反了这一规则。此外,似乎将这些
enum
值视为整数(例如,在
NSPredicate
中)并不正确

我将上面的
enum
声明添加到一个带有空
main
函数的C文件中,并使用
i686-apple-darwin9-gcc-4.0.1
对其进行编译。因此,尽管这些类型的
enum
s可能不符合C标准(正如Parapa在下面指出的),但至少gcc正在将它们编译成某种类型


那么,这种类型是什么,我如何使用它,例如,在格式字符串中?

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

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

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

这是苹果对C的扩展,它基本上将这些枚举转换为:

typedef enum {
    iTunesESrcLibrary = 'k'<<24 | 'L'<<16 | 'i'<<8 | 'b',
 ...
 }
typedef枚举{
iTunesSrcLibrary='k'C99,TC3读取:

6.4.4.4§2:

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

6.4.4.4§10:

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

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


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

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

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


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

当使用多个字符的字符常量声明整数时,该整数对为其开发该常量的计算机的类型非常敏感。由于所有原始Mac API都在PPC或更早版本的计算机上,因此相对于Intel计算机,它们是反向的

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

如果您正在构建一个通用二进制文件,您需要使用一个


<> P>未能纠正这些代码会留给你只能在PowerPC机器上工作的代码,不管编译器错误如何。

它不仅仅是一个苹果扩展。我在几个C编译器中使用它,而ARC,SEC 2.5.2表明它是有效C++。Caly。正式而言,它依赖于实现。谢谢,我不知道,Linux中的gcc确实警告过它。@codelogic:我认为警告是因为实际整数值不能保证在编译器/系统之间一致。只要你不依赖“abc”可能有值6382179的事实,你就和f一样安全ar正如我所知。警告可能是因为该值依赖于实现-因此是不可移植的。是的,没错。它记录在gcc中的“-Wno multichar”选项中。很好-官方信息。:)在c99之前,这也是一个常见但不可移植的非标准扩展。@dmckee:多字节字符常量已经是ANSI-C89的一部分(见第3.1.3.4节),所以它一直是标准的!嗯。啊。每天学点东西。是的。我犯了错