6.2.7 兼容型和复合型 http://port70.net/%7Ensz/c/c99/n1256.html#6.2.7C99 规范指出
[...]此外,在单独的翻译单元中声明的两个结构体、联合或枚举类型是兼容的,如果它们的标签和成员满足以下要求:如果一个使用标签声明,则另一个应使用相同的标签声明。 [...]
The C99基本原理 https://www.open-std.org/JTC1/sc22/wg14/www/C99RationaleV5.10.pdf提到“C99 中的安静变化”,没有解释,
不同翻译单元中的结构或联合类型声明现在必须具有相同的标签才能兼容。
为使结构体标签兼容而采用这种严格的命名规则的原因是什么?
据我了解这条规则,如果以下结构的声明位于不同的翻译单元中,则它们将不兼容
struct coord {int x; int y;};
and
struct point {int x; int y;};
C标准中“兼容”的技术规范本质上是指如果两种类型能够完成为同一类型,则它们是兼容的。例如,int [3]
and int []
是兼容的,因为后者可以完成int [3]
.
请注意,这是“完整”的常见英语含义,并不完全是 C 标准中“完整”的含义,因为 C 标准为对象类型指定了“完整”或“不完整”,但这种兼容性概念适用于函数类型也:int (int, float)
兼容于int ()
.
标准使用这种兼容性概念来描述语言并支持编译器行为,其中两种类型可能是同一类型,但信息不完全可用。例如,当将一个指针分配给另一个指针时,我们可能没有有关类型的完整信息,但是,如果它们可能是相同的类型,我们希望接受分配。另一方面,如果我们知道类型不相同(即使在允许限定符等允许的差异之后),我们想要发出有关分配的诊断。
对于结构类型,struct { int a, b; }
, struct foo { int a, b; }
, and struct bar { int a, b; }
都是不同的类型,没有任何两个可以完成为同一类型,因此它们不兼容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)