【发布时间】:2018-07-04 20:45:16
【问题描述】:
出于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,它表示“指向结构对象的指针,经过适当转换,指向其初始成员(或者如果该成员是位字段,则指向单元它所在的位置),反之亦然。”
由于B里面的struct { int a; }没有名字,我们就叫它A'吧。
“适当地”没有明确定义。我假设如果A * 是一个指向A' 类型对象的有效指针,那么(A *) b 会执行适当的转换,并且类似地,如果a 是指向A' 的指针,它位于@ 987654336@,那么(B *) a是一个合适的转换。
所以问题是:A * 是指向 A' 类型对象的有效指针吗?
根据6.7.6.1,如果A 与A' 兼容,则A * 与A' * 兼容。
根据6.2.7,“如果它们的类型相同,则两种类型具有兼容的类型……此外,如果它们的标签和成员满足以下要求,则在单独的翻译单元中声明的两种结构、联合或枚举类型是兼容的:如果一个用一个标签声明,另一个应该用相同的标签声明。如果两者都在各自翻译单元内的任何地方完成,则适用以下附加要求:它们的成员之间应存在一一对应关系,使得每对对应的成员都声明为兼容类型;如果该对的一个成员使用对齐说明符声明,则另一个成员使用等效的对齐说明符声明;如果该对中的一个成员声明了一个名称,则另一个成员声明为相同的名称。对于两个结构,对应的成员应该以相同的顺序声明……”
6.7.2.3 5 这些不能是同一类型:“不包含标记的结构、联合或枚举类型的每个声明都声明了不同的类型。”
由于它们不是同一类型,它们是否兼容? 6.2.7 中的文字表示,如果在单独的翻译单元中声明它们是兼容的,但它们在同一个翻译单元中。
【问题讨论】:
-
"6.2.7 中的文字说如果在单独的翻译单元中声明它们是兼容的,但它们在同一个翻译单元中。"...所以它们不兼容?我不明白这个问题。该标准规定,如果 X 或 Y 为真,则两种类型是兼容的。 X 和 Y 都不是真的。
-
@T.C.:是的,我问是因为,从字面上看,我没有看到条件满足,所以这个声明并没有断言
A和A'是兼容的。但是(a)我可能弄错了。 (b) 标准中可能有其他句子涵盖这一点。 (c) 直观地说,它们应该是兼容的。如果在单独的翻译单元中,我们以相同的方式声明A'',那么它与A兼容,并且与A'兼容。如果A与A''兼容,A''与A'兼容,但A与A'不兼容,那就太奇怪了。
标签: c language-lawyer