考虑这个代码片段:
#include <threads.h>
int thread_start(void *ptr)
{
struct {
int a;
int b;
} *data = ptr;
return 0;
}
int main(int argc, char *argv[])
{
struct {
int a;
int b;
} data;
thrd_t thread;
thrd_create(&thread, thread_start, &data);
thrd_join(thread, NULL);
return 0;
}
关于铸造void *
to struct { int; int } *
,假设匿名结构的字段与最初分配的结构的字段相同,这是根据 C 标准明确定义的行为吗?
如果这些结构不在同一文件中,它们将是兼容的。
Had thread_start
已在单独编译的 .c 文件中定义(即单独的翻译单位)那么它们就会兼容。具体来说,成员的名称、类型和顺序是相同的,并且它们都具有相同的标签,在本例中没有标签。
Section §6.2.7 ¶1 http://port70.net/%7Ensz/c/c11/n1570.html#6.7.2.1p1 of the C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf列出了这些要求:
两种类型有兼容型如果它们的类型相同。
用于确定两种类型是否相同的附加规则
兼容的类型说明符在 6.7.2 中进行了描述,
6.7.3 中的类型限定符,以及 6.7.6 中的声明符。此外,声明了两个结构体、联合或枚举类型在
单独的翻译单元如果它们的标签和
成员满足以下要求: 如果已声明
一个标签,另一个应使用相同的标签声明。
如果两者都在各自的任何地方完成
翻译单元,则适用以下附加要求:
他们之间应该是一一对应的
成员使得每对对应的成员是
使用兼容类型声明;如果声明了该对中的一个成员
使用对齐说明符,另一个使用
等效对齐说明符;如果这对中的一个成员
用一个名称声明,另一个用相同的名称声明
姓名。对于两个结构体,应在中声明相应的成员
相同的顺序。对于两个结构或联合,对应
位域应具有相同的宽度。对于两个枚举,
相应的成员应具有相同的值。
所以这些结构would如果它们不在同一文件中,则可以兼容。但正因为如此,这些结构不兼容。
§6.7.2.1 ¶8 http://port70.net/%7Ensz/c/c11/n1570.html#6.7.2.1p8 says:
结构或联合说明符中结构声明列表的存在声明了翻译单元内的新类型。
因此,§6.7.2.1 指定了单个翻译单元中发生的情况。当声明位于单独的翻译单元中时,第 6.2.7 节中的规范将覆盖第 6.7.2.1 节中的规范。
NB: It's easy to confuse 6.2.7 and 6.7.2.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)