兼容的结构类型

时间:2019-09-08 10:04:18

标签: c types language-lawyer

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这样的类型)。但是,如果我正确理解了标准(也许我误解了第二句话),则可以这样做。如果是这样,背后的理由是什么?为什么还不指定单独的翻译单元中的结构在结构上也必须等效?

1 个答案:

答案 0 :(得分:4)

  

闻起来像未定义的行为

因为是。


  

但是如果我正确地理解了标准

在特定情况下似乎并非如此。

  

这是允许的。

不。我看不到(也没有解释)如何用这种方式解释标准语言。

标准说

  

如果两者都在各自翻译单位内的任意位置完成

这种情况在您的示例中仍然存在。

  

然后适用以下附加要求:其成员之间应存在一对一的对应关系,以使每对对应的成员都声明为兼容类型

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


  

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

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