c - 兼容的结构类型
问题描述
C 11 标准将结构兼容性定义如下(6.2.7):
此外,如果它们的标记和成员满足以下要求,则在单独的翻译单元中声明的两种结构、联合或枚举类型是兼容的:如果用标记声明一个,则另一个应用相同的标记声明。如果两者都在各自翻译单元内的任何地方完成,则适用以下附加要求:它们的成员之间应存在一一对应关系,以便每对对应的成员都声明为兼容的类型……</p>
这意味着我可以有 2 个这样的文件:
富.c:
struct struc {
int x;
};
int foo(struct struc *s)
{
return s->x;
}
主.c:
struct struc {
float x;
};
int foo(struct struc *s);
int main(void)
{
return foo(&(struct struc){1.2f});
}
闻起来像未定义的行为(就像 int 和 float 这样的类型一样)。但如果我正确理解标准(也许我误解了第二句话),这是允许的。如果是这样,这背后的理由是什么?为什么不同时指定单独翻译单元中的结构也必须在结构上等效?
解决方案
闻起来像未定义的行为
因为它是。
但如果我正确理解标准
在此特定情况下,情况似乎并非如此。
这是允许的。
没有。我看不到(您也没有解释)如何以这种方式解释标准语言。
标准说
如果两者都在各自翻译单元内的任何地方完成
这个条件在你的例子中成立。
那么以下附加要求适用:它们的成员之间应存在一一对应关系,以便每对对应的成员都声明为兼容类型
不满足此要求,因此类型不兼容。
为什么不同时指定单独翻译单元中的结构也必须在结构上等效?
该标准明确规定了这一点。“它们的成员之间存在一对一的对应关系,使得每一对对应的成员都被声明为兼容的类型”正是结构等价的定义。