C99标准在6.2.7.1节中具有以下语言:
如果它们的标记和成员满足以下要求,则在单独的转换单元中声明的两个结构,联合或枚举类型是兼容的:如果使用标记声明一个,则另一个应使用相同的标记声明.如果两者都是完整类型,则以下附加要求适用:其成员之间应存在一对一的对应关系,使得每对相应成员都声明为具有兼容类型,并且如果相应对的一个成员是使用名称声明,另一个成员使用相同的名称声明.对于两个结构,相应的成员应按相同的顺序声明.对于两个结构或联合,相应的位域应具有相同的宽度.对于两个枚举,相应的成员应具有相同的值.(重点补充)
特别是,此规则使这两个struct
具有相同布局的s不兼容,因为它们的标记和成员名称不匹配:
struct x_type { int x; }; struct y_type { // << Different tag int y; // << Different member name };
很容易理解为什么成员类型及其声明顺序必须相同.但是,不清楚为什么标签和成员名称也需要匹配,即使它们不影响二进制布局struct
?