Win*_*don 3 c types language-lawyer
C 11 标准定义结构兼容性如下 (6.2.7):
\n\n\n\n\n此外,在单独的翻译单元中声明的两个结构体、联合体或枚举类型如果其标记和成员满足以下要求,则它们是兼容的:如果其中一个使用标记进行声明,则另一个应使用相同的标记进行声明。如果两者都在各自翻译单元内的任何位置完成,则适用以下附加要求:其成员之间应存在一对一的对应关系,使得每对对应的成员都使用兼容类型\xe2\x80\xa6 进行声明
\n
这意味着我可以有两个这样的文件:
\n\nfoo.c:
\n\nstruct struc {\n int x;\n};\n\nint foo(struct struc *s)\n{\n return s->x;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n主要.c:
\n\nstruct struc {\n float x;\n};\n\nint foo(struct struc *s);\n\nint main(void)\n{\n return foo(&(struct struc){1.2f});\n}\nRun Code Online (Sandbox Code Playgroud)\n\n闻起来像未定义的行为(就像 int 和 float 等类型一样)。但如果我正确理解了标准(也许我误解了第二句话),这是允许的。如果是这样,其背后的理由是什么?为什么不指定单独翻译单元中的结构也必须在结构上等效?
\n闻起来像未定义的行为
因为它是。
但如果我正确理解了标准
在这个特定的例子中,情况似乎并非如此。
这是允许的。
没有。我不明白(你也没有解释)如何以这种方式解释标准语言。
标准说
如果两者都在各自翻译单元内的任何地方完成
这个条件在你的例子中成立。
那么以下附加要求适用:它们的成员之间应该是一一对应的,使得每对对应的成员都声明为兼容的类型
不满足此要求,因此类型不兼容。
为什么不指定单独翻译单元中的结构也必须在结构上等效?
该标准明确规定了这一点。“它们的成员之间一一对应,使得每对对应的成员都用兼容的类型声明”正是结构等效的定义。
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |