C语言中的枚举(enum)占用的大小是多少?

19 浏览
0 Comments

C语言中的枚举(enum)占用的大小是多少?

我正在创建一组枚举值,但我需要每个枚举值的宽度为64位。如果我记得正确的话,枚举通常与int类型大小相同;但我记得在某处读到(至少在GCC中)编译器可以根据需要调整枚举的宽度以容纳其值。所以,是否可能创建一个宽度为64位的枚举?

0
0 Comments

在C语言中,枚举类型的大小是根据编译器的实现来确定的。根据标准,编译器可以选择适当的类型来表示枚举,只要所有的枚举值都能够被包含在内即可。

然而,有些编译器提供了选项来打破标准,并使用能够容纳所有枚举值的最小类型。例如,GCC编译器可以通过使用__attribute__((__packed__))来实现这个功能。下面是一个使用这个选项的示例:

enum ord {
    FIRST = 1,
    SECOND,
    THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )

这段代码中,枚举类型ord被声明为packed,意味着它的大小只有1个字节。通过使用STATIC_ASSERT宏来检查sizeof(enum ord)的值是否为1,可以验证这一点。

需要注意的是,尽管某些编译器可能会使用较小的类型来存储枚举值,但这并不违反标准。根据标准,编译器可以选择任何适当的类型来表示枚举,只要所有的枚举值都能够被包含在内。

事实上,在某些MacOS的C++编译器中,我曾经看到它们利用枚举值的有限范围,将它们存储在较小的类型中。具体是Metrowerks Codewarrior还是XCode我已经记不清楚了。这是符合C++标准的。因此,不能一般地假设sizeof(MyEnum)等于sizeof(int)。

0
0 Comments

在C语言中,枚举(enum)只能保证足够大以容纳int类型的值。编译器可以根据定义的枚举常量来选择实际使用的类型,因此如果可以表示你定义的值,它可以选择更小的类型。如果你需要的枚举常量无法容纳在int类型中,你需要使用特定于编译器的扩展来实现。

某些情况下,在补码平台上(现代的所有系统都是这样的吗?),可以通过确保枚举包含负值的方式来强制将其大小设置为int类型。虽然这种技术不推荐使用。

还某些情况下,一个答案似乎暗示枚举的大小与int相同。《Michael Stum的答案》引用C99标准,表示枚举的大小可以与char类型一样小。

另一个人指出,第一个回答的第一句话是错误的。枚举只能保证足够大以容纳枚举中最大的枚举器的值。

最后有人指出,在标准C中,所有枚举器的类型都是int。你描述的行为是特定于编译器的扩展。

枚举在C语言中的大小是不确定的,可以根据具体的编译器和枚举常量的定义进行选择。如果需要确保枚举的大小与int类型相同,可以使用特定于编译器的方法来实现。

0
0 Comments

C语言中的枚举类型是一种用于定义一组具名整数常量的数据类型。在C语言标准中规定了枚举类型的大小和兼容性的要求。

根据C语言标准的规定,枚举类型的值必须是可表示为int类型的整数常量表达式。枚举类型可以与char、有符号整数类型或无符号整数类型兼容。具体选择哪种类型是由编译器实现定义的,但必须能够表示枚举的所有成员的值。

如果枚举类型中的值不是int类型,那么可能会出现不受支持的行为,这可能会在未来的一两年内带来问题。

需要注意的是,枚举常量和枚举类型并不是相同的概念。枚举常量是枚举声明列表中的内容,而枚举类型是实际的变量。因此,尽管枚举常量必须是int类型,但实际的枚举变量可以是另一种类型。这是标准中已知的一个不一致之处。

为了进一步说明,对于enum my_enum { my_value }这个例子,my_value的类型将是int,但enum my_enum可以具有一个由实现定义的类型,该类型必须至少能表示枚举的所有值。因此,my_value可以被转换为enum my_enum,但不会发生溢出。

在一些编译器中,可以使用--enum_is_int选项来指定枚举类型的大小。

枚举类型的大小和兼容性是由C语言标准规定的。枚举类型的值必须是int类型,但实际的枚举变量可以是其他类型。如果不遵循这些规定,可能会导致不受支持的行为。

0