C 不完整枚举和完整枚举是否兼容类型?
在一个翻译单元中,我有一个完整定义的枚举:C 不完整枚举和完整枚举是否兼容类型?,c,enums,C,Enums,在一个翻译单元中,我有一个完整定义的枚举: typedef enum E { A, B, C } ET; 在另一个例子中,我对该枚举只有一个不完整的定义: typedef enum E ET; 我想知道这两种类型是否兼容 中描述了兼容类型的定义,但对我来说似乎很模糊。当两个枚举都是完整类型时,有一种解释,但我不确定如果一个是而不是另一个,会发生什么 下面这句话我应该理解什么 一个是枚举类型,另一个是该枚举的基础类型 这是否意味着这两种类型都是兼容的?Oooch对,不完整枚举是一个类似的编译器
typedef enum E { A, B, C } ET;
在另一个例子中,我对该枚举只有一个不完整的定义:
typedef enum E ET;
我想知道这两种类型是否兼容
中描述了兼容类型的定义,但对我来说似乎很模糊。当两个枚举都是完整类型时,有一种解释,但我不确定如果一个是而不是另一个,会发生什么
下面这句话我应该理解什么
一个是枚举类型,另一个是该枚举的基础类型
这是否意味着这两种类型都是兼容的?Oooch对,
不完整枚举
是一个类似的编译器扩展。答案的其余部分假设“incomlpete enum”遵守与不完整结构和联合相同的规则
不完整枚举和完整枚举是否兼容类型
是(如果名称相同)
这是否意味着两种类型都兼容
对。从您链接到的引用中:
如果需要,T型和U型是兼容的
- 它们是相同的类型(由typedef引入的相同名称或别名)
ET
是两个单元中enum E
的别名-ET
在两个单元中都兼容。后来:
- 它们都是结构/联合/枚举类型,并且
- (C99)如果一个用标记声明,另一个也必须用相同的标记声明
- 如果这两种类型都是完整类型,则blabla
中,枚举E
具有相同的标记-E
,因此它们也是兼容的。第二个TU中的枚举E不完整,因此附加点不适用于此处
我们还要提到C11 6.2.7兼容类型和复合类型的原始版本:
确定两种类型是否兼容的其他规则在6.7.2中针对类型说明符进行了描述,在6.7.3中针对类型限定符进行了描述,在6.7.6中针对声明符进行了描述。
此外,如果在单独的翻译单元中声明的两个结构、联合或枚举类型的标记和成员满足以下要求,则它们是兼容的:如果一个使用标记声明,则另一个应使用相同的标记声明。
如果两者都是在各自翻译单位内的任何地方完成的,则 以下附加要求适用:
其成员之间应存在一对一的对应关系,以使每对对应成员声明为兼容类型
如果使用对齐说明符声明对中的一个成员,则使用等效对齐说明符声明另一个成员
如果对中的一个成员用名称声明,则另一个成员用相同的名称声明。
对于两个结构,应按照相同的顺序声明相应的构件。对于两个结构或联合体,相应的位字段应具有相同的宽度。
对于两个枚举,相应的成员应具有相同的值
下面这句话我应该理解什么 一个是枚举类型,另一个是该枚举的基础类型 每个
enum
都有一个“底层类型”-作为一个类型,它实际上不是enum
,而是int
或char
或另一个实现定义的类型。让我们引用C116.7.2.2枚举说明符:
无符号int
或int
。请参阅编译器文档,如:
与每个枚举类型兼容的整数类型(C90 6.5.2.2,
C99和C116.7.2.2)
通常,如果中没有负值,则类型为unsigned int
枚举,否则为int。如果指定了-fshort enums,则如果
有负值,它是有符号字符的第一个,short和
可以表示所有值的int,否则它是
无符号字符、无符号短字符和无符号整数,可以表示所有
价值观
在某些目标上,-fshort enum是默认值;这是由ABI决定的
这一点
一个是枚举类型,另一个是枚举的基础类型
是关于无符号整数
和枚举E
可能是兼容类型,因此您最好使用无符号整数
您的问题没有意义。C没有不完整的enum
s(不同于不完整的数组、联合或结构),即使在您不请求-pedantic
一致性检查时,许多编译器都支持它们
这项记录
typedef enum E ET;
这是不正确的
根据C标准(6.7.2.3标签)
3表单的类型说明符
如果没有枚举器,则列表只能在其类型之后出现
指定已完成
因此,如果前面有枚举
E
的完整声明,那么关于兼容性的问题将毫无问题地得到解决。否则,编译器将发出错误消息。但是。。兼容类型与此无关<两个文件中的code>enum E和ET
是相同的类型。我不确定第一个TU中的ET
是否与第二个TU中的ET
相同,这是我的问题。事实上,如果它们是同一类型,我同意它们是兼容的。在第二个示例中,您将如何使用ET
enum identifier