gpt4 book ai didi

c - 未标记结构的重新声明是兼容类型吗?

转载 作者:太空狗 更新时间:2023-10-29 16:56:38 25 4
gpt4 key购买 nike

用于 this question 中表达的目的,我们想这样做:

typedef struct { int a; } A;
typedef struct { struct { int a; }; int b; } B;

A *BToA(B *b) { return (A *) b; }
B *AToB(A *a) { return (B *) a; }

希望类型转换符合 C 2011 6.7.2.1 15 ,它表示“指向结构对象的指针,经过适当转换,指向其初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。”

因为 struct { int a; B 里面没有名字,我们称它为A'

“适本地”没有明确定义。我假设如果 b 是指向 A' 类型对象的有效指针,那么 (A *) b 会执行合适的转换,并且,类似地,如果 a 是指向 B 中的 A' 的指针,则 (B *) a 是一个合适的转换。

所以问题是:A * 是指向 A' 类型对象的有效指针吗?

根据 6.7.6.1 , 如果 AA' 兼容,则 A *A' * 兼容。

根据 6.2.7 ,“如果类型相同,则两种类型具有兼容类型......此外,如果它们的标签和成员满足以下要求,则在单独的翻译单元中声明的两个结构, union 或枚举类型是兼容的:如果一个是用标签声明的,则其他应使用相同的标签声明。如果两者都在各自的翻译单元中的任何地方完成,则适用以下附加要求:它们的成员之间应存在一对一的对应关系,以便每对对应的成员都声明为兼容类型;如果该对中的一个成员是用对齐说明符声明的,则另一个成员是用等效的对齐说明符声明的;如果该对中的一个成员用名称声明,则另一个成员也用相同的名称声明。对于两个结构,相应的成员应该以相同的顺序声明……”

这些不能是同一类型 6.7.2.3 5 :“每个不包含标记的结构、 union 或枚举类型的声明都声明了一个不同的类型。”

既然不是同一种类型,那它们兼容吗? 6.2.7中的文字说如果在单独的翻译单元中声明它们是兼容的,但它们在同一个翻译单元中。

最佳答案

正如您在问题中提出的那样,标准清楚明确地说两个结构定义 struct { int a; } 在同一个翻译单元中声明两个不兼容的类型。尽管这可能很“奇怪”。 Compilers have always followed the standard .

这对我来说似乎是合理的行为:如果您的项目中碰巧有语义上不相关的结构,而这些结构恰好有一个具有相同类型的成员列表,您确实希望编译器拒绝两者之间的意外赋值。


回复。您问题中的代码,根据 6.7.2.1/13,

The members of an anonymous structure or union are considered to be members of the containing structure or union.

所以我会将 B 的定义等同于:

typedef struct { int a; int b; } B;

用于进一步分析。

关于c - 未标记结构的重新声明是兼容类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48445629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com