兼容的结构类型

Win*_*don 3 c types language-lawyer

C 11 标准定义结构兼容性如下 (6.2.7):

\n\n
\n

此外,在单独的翻译单元中声明的两个结构体、联合体或枚举类型如果其标记和成员满足以下要求,则它们是兼容的:如果其中一个使用标记进行声明,则另一个应使用相同的标记进行声明。如果两者都在各自翻译单元内的任何位置完成,则适用以下附加要求:其成员之间应存在一对一的对应关系,使得每对对应的成员都使用兼容类型\xe2\x80\xa6 进行声明

\n
\n\n

这意味着我可以有两个这样的文件:

\n\n

foo.c:

\n\n
struct struc {\n    int x;\n};\n\nint foo(struct struc *s)\n{\n    return s->x;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要.c:

\n\n
struct struc {\n    float x;\n};\n\nint foo(struct struc *s);\n\nint main(void)\n{\n    return foo(&(struct struc){1.2f});\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

闻起来像未定义的行为(就像 int 和 float 等类型一样)。但如果我正确理解了标准(也许我误解了第二句话),这是允许的。如果是这样,其背后的理由是什么?为什么不指定单独翻译单元中的结构也必须在结构上等效?

\n

n. *_* m. 5

闻起来像未定义的行为

因为它是。


但如果我正确理解了标准

在这个特定的例子中,情况似乎并非如此。

这是允许的。

没有。我不明白(你也没有解释)如何以这种方式解释标准语言。

标准说

如果两者都在各自翻译单元内的任何地方完成

这个条件在你的例子中成立。

那么以下附加要求适用:它们的成员之间应该是一一对应的,使得每对对应的成员都声明为兼容的类型

不满足此要求,因此类型不兼容。


为什么不指定单独翻译单元中的结构也必须在结构上等效?

该标准明确规定了这一点。“它们的成员之间一一对应,使得每对对应的成员都用兼容的类型声明”正是结构等效的定义。