C99标准第6.2.7.1节中有以下语言:
如果它们的标签和成员满足以下要求,则在单独的翻译单元中声明的两个结构体、联合或枚举类型是兼容的:如果其中一个使用标签进行声明,则另一个应使用相同的标签进行声明。如果两者都是完整类型,则适用以下附加要求:它们的成员之间应存在一一对应关系,使得每对对应的成员都使用兼容的类型进行声明,并且如果相应对中的一个成员使用名称声明,则另一个成员也使用相同的名称声明。对于两个结构体,相应的成员应以相同的顺序声明。对于两个结构或联合,相应的位域应具有相同的宽度。对于两个枚举,对应的成员应具有相同的值。 (强调已添加)
特别是,这条规则使得这两个struct
具有相同布局的不兼容,因为它们的标签和成员名称不匹配:
struct x_type {
int x;
};
struct y_type { // << Different tag
int y; // << Different member name
};
很容易理解为什么成员类型及其声明顺序必须相同。然而,尚不清楚为什么标签和成员名称也需要匹配,即使它们不影响二进制布局struct
?
您引用的文本不是在谈论布局兼容的类型,而是在谈论的类型相同类型。该规则是 C 如何定义一个类型的两个定义是否是同一类型的有效重新定义。
在你的例子中你是对的x_type
and y_type
不兼容,因为它们肯定不描述相同的类型!如果它们兼容,则意味着调用void foo(struct x_type*)
带有类型参数struct y_type*
是有效的,这当然不是本意。
您引用的文本和以下段落是 C++ ODR 的 C 等效项,并且要求标签和成员名称相同类似于 [basic.def.odr] 中的措辞:
给定这样一个名为D
在多个翻译单元中定义,然后
— 每个定义D
应由相同的令牌序列组成;和
- 在每个定义中D
,根据 3.4 查找的相应名称应指代定义中定义的实体D
,或应引用同一实体,在重载解析(13.3)之后和部分模板专业化(14.8.3)匹配之后,[...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)