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枚举说明符:

  • 每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型选择由实现定义,但应能够表示枚举的所有成员的值。枚举类型在紧接着终止枚举器声明列表的}之后是不完整的,然后才完成
  • 第一句话相当明确。这个编译器选择的“实类型”是依赖的-大多数时候它只是一个
    无符号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