在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
答案 0 :(得分:5)
我见过的这三个词是“标签类型”。理由是,这三个类型类别由标签名称空间中的关键字和 tag 标识。 C标准在多个地方提到了这些标签,尤其是在以下地方:
6.2.3标识符的命名空间
[...]因此,对于不同类别的 标识符,如下:
- 结构,联合和枚举的标记(通过跟随任何关键字struct,union或enum进行歧义消除);
答案 1 :(得分:3)
C类型系统很复杂,充满了各种术语分组。
形式上没有包含这3种类型的类型类别。就形式类型系统(6.2.5)而言,它们几乎没有共同之处。
struct
和union
是派生的类型。意味着您可以有一个struct
或union
包含其他对象。struct
是聚合类型(与数组一样),但是union
是其自身的类型。还有enum
作为标量类型-它不包含其他对象的实例。但是,这3种不同的类型有一些共同点:
它们具有使用相同C名称空间的标签(如@StoryTeller的答案中所述):
6.2.3标识符的名称空间
/-/
因此,对于各种类别的标识符,存在单独的名称空间,如下所示:
/-/
-结构,联合和枚举的标签(通过跟随关键字struct
,union
或enum
中的任何关键字来消除歧义)
对于兼容类型6.2.7,它们具有相同的规则:
此外,如果两个结构,联合或枚举类型的标记和成员满足以下要求,则它们是兼容的:...
因此,尽管它们的类型不同,但是它们共享相同的标签系统和用于标签的相同名称空间。您的特定编译器通过让它们都共享用于打包(删除填充)的相同宏来利用此优势。这对于可以填充字段的struct
和union
来说是有意义的,但对于enum
而言却没有太大意义,因为其中的填充概念没有任何意义。
答案 2 :(得分:2)
就您的实际用例而言,我同意StoryTeller的回答。这个答案说明标准中没有这样的定义。
不,不是正式的。类型在6.2.5中讨论。它为某些类型的组提供标签,但没有一个包含确切的并集,结构和枚举。
- 类型 烧焦 ,有符号和无符号整数类型,以及枚举类型是 统称 整数类型 。整数和实数浮点类型统称为 实型
20。 任意数量 派生类型 可以从对象,函数和 不完整的类型,如下所示:[...] -A 结构 [...] -A 联合类型[...]