首页 > 解决方案 > 兼容的结构类型

问题描述

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

标签: ctypeslanguage-lawyer

解决方案


闻起来像未定义的行为

因为它是。


但如果我正确理解标准

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

这是允许的。

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

标准说

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

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

那么以下附加要求适用:它们的成员之间应存在一一对应关系,以便每对对应的成员都声明为兼容类型

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


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

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


推荐阅读