【问题标题】:Compatible struct types兼容的结构类型
【发布时间】:2020-01-10 10:47:38
【问题描述】:

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

【问题讨论】:

  • intfloat 就标准而言不是“兼容类型”。
  • 它确实指定它们在结构上是等效的(“相应的成员被声明为兼容的类型”)——并且成员名称是相同的(它谈到了缺少的其余部分中的名称最后一句)。
  • @PSkocik 但是不是说结构对等仅在它们都在同一个翻译单元中完成时才适用吗?
  • @WingerSendon “如果两者都在各自的翻译单元内完成”。您在 foo.c 中的 struct struc 已完成(==不仅仅是前向声明)并且您在 main.c 中的 struct struc 已完成:struct struc 均在各自的翻译单元内完成。
  • 标准说的是“各自的”,而不是“无关的”。引用其他人(或委员会或文件)时,请注意准确引用(或用“…”表示遗漏或用括号重新措辞/解释)。

标签: c types language-lawyer


【解决方案1】:

闻起来像未定义的行为

因为它是。


但如果我正确理解标准

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

这是允许的。

不。我没有看到(你也没有解释)标准语言是如何被这样解释的。

标准说

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

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

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

这个要求不满足,所以类型不兼容。


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

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

【讨论】:

  • 为什么不直接说floatint 不兼容?或者至少在你的答案中添加它,我得到了语言层的答案,但那些类型的答案没有帮助
  • @user2162550 OP 显然明白 int 和 float 不兼容。问题是关于可能使这两个结构兼容的语言。
猜你喜欢
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2021-06-27
  • 2013-05-08
  • 2018-09-02
  • 2016-01-19
相关资源
最近更新 更多