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