假设我有a.c
和b.c
,它们都定义了被调用的类型struct foo
,具有不同的定义:
#includestruct foo { int a; }; int a_func(void) { struct foo f; f.a = 4; printf("%d\n", f.a); return f.a * 3; }
#includestruct foo { // same name, different members char *p1; char *p2; }; void b_func(void) { struct foo f; f.p1 = "hello"; f.p2 = "world"; printf("%s %s\n", f.p1, f.p2); }
在C中,这些文件是否可以作为符合标准的程序的一部分链接在一起?
(在C++中,我认为One Definition Rule禁止这样做.)
结构标签是没有连接的标识符(C11 6.2.2/6)
关于没有链接的标识符的多个定义的规则在6.7/3中找到:
如果一个标识符没有联动,应当有所述标识符的使用相同的范围,并在相同的名称空间不超过一个声明(按照声明符或类型说明符),不同之处在于:
如果类型不是可变修改类型,则可以重新定义typedef名称以表示与其当前相同的类型;
标签可以按照6.7.2.3中的规定重新声明.
在您的程序中,两个声明foo
属于不同的范围,因此不满足"具有相同范围"的条件,因此不违反此规则.