C:结构,联合和枚举的通用术语?

时间:2018-12-04 12:26:55

标签: c language-lawyer

在C语言标准或文献中,结构,联合和枚举类型是否有通用术语?

更新:使用以下宏时出现此问题:

/* GCC */
#if defined(__GNUC__)

# define TYPEDEF_PACKED_BEGIN(type, tag)                   \
typedef type __attribute__((packed, aligned(1))) tag

# define TYPEDEF_PACKED_END

/* Green Hills */
#elif defined(__ghs__)

# define TYPEDEF_PACKED_BEGIN(type, tag)                   \
#pragma pack(1)                                            \
typedef type tag

# define TYPEDEF_PACKED_END                                \
#pragma pack()

#endif

TYPEDEF_PACKED_BEGIN(struct, my_struct_tag) {
    int a;
    int b;
} my_struct_type;
TYPEDEF_PACKED_END

TYPEDEF_PACKED_BEGIN(enum, my_enum_tag) {
    E_FOO,
    E_BAR
} my_enum_type;
TYPEDEF_PACKED_END

3 个答案:

答案 0 :(得分:5)

我见过的这三个词是“标签类型”。理由是,这三个类型类别由标签名称空间中的关键字和 tag 标识。 C标准在多个地方提到了这些标签,尤其是在以下地方:

  

6.2.3标识符的命名空间

     

[...]因此,对于不同类别的   标识符,如下:

     
      
  • 结构,联合和枚举的标记(通过跟随任何关键字struct,union或enum进行歧义消除);
  •   

答案 1 :(得分:3)

C类型系统很复杂,充满了各种术语分组。

形式上没有包含这3种类型的类型类别。就形式类型系统(6.2.5)而言,它们几乎没有共同之处。

  • 枚举类型被分类为基本类型之一。
  • structunion派生的类型。意味着您可以有一个structunion包含其他对象。
  • struct聚合类型(与数组一样),但是union是其自身的类型。还有enum作为标量类型-它不包含其他对象的实例。

但是,这3种不同的类型有一些共同点:

它们具有使用相同C名称空间的标签(如@StoryTeller的答案中所述):

  

6.2.3标识符的名称空间
  /-/
  因此,对于各种类别的标识符,存在单独的名称空间,如下所示:
  /-/
  -结构,联合和枚举的标签(通过跟随关键字structunionenum中的任何关键字来消除歧义)

对于兼容类型6.2.7,它们具有相同的规则:

  

此外,如果两个结构,联合或枚举类型的标记和成员满足以下要求,则它们是兼容的:...

因此,尽管它们的类型不同,但是它们共享相同的标签系统和用于标签的相同名称空间。您的特定编译器通过让它们都共享用于打包(删除填充)的相同宏来利用此优势。这对于可以填充字段的structunion来说是有意义的,但对于enum而言却没有太大意义,因为其中的填充概念没有任何意义。

答案 2 :(得分:2)

就您的实际用例而言,我同意StoryTeller的回答。这个答案说明标准中没有这样的定义。

不,不是正式的。类型在6.2.5中讨论。它为某些类型的组提供标签,但没有一个包含确切的并集,结构和枚举。

  
      
  1. 类型   烧焦   ,有符号和无符号整数类型,以及枚举类型是   统称   整数类型   。整数和实数浮点类型统称为   实型
  2.   
     

20。   任意数量   派生类型   可以从对象,函数和   不完整的类型,如下所示:[...] -A 结构 [...] -A 联合类型[...]