在第一个编译单元中:
/* From .h file */
struct my_struct {
int foo;
long bar;
};
void my_struct_init(struct my_struct*);
int my_struct_get_int(struct my_struct*);
long my_struct_get_long(struct my_struct*);
/* From .c file */
void my_struct_init(struct my_struct* o) {
o->foo = 0;
o->bar = 0L;
}
int my_struct_get_int(struct my_struct* o) {
return o->foo;
}
long my_struct_get_long(struct my_struct* o) {
return o->bar;
}
在第二个编译单元中:
/* From .h file */
struct my_struct {
/* Named differently */
int foo_different;
long bar_different;
};
void my_struct_init(struct my_struct*);
int my_struct_get_int(struct my_struct*);
long my_struct_get_long(struct my_struct*);
/* From .c file */
int main(void) {
struct my_struct o;
my_struct_init(&o);
if (o.foo_different != 0 || o.bar_different != 0L) {
/* (Just assume EXIT_FAILURE is 1) */
return 1;
}
o.foo_different = 1;
o.bar_different = 2L;
if (my_struct_get_int(&o) != 1 || my_struct_get_long(&o) != 2L) {
return 1;
}
return 0;
}
尽管两个结构具有相同的名称,并且成员具有相同的类型和顺序,但是成员具有不同的名称。
这是否意味着未定义以上内容?还是会永远成功?
(对于上下文,如果正常包含头文件,我将使用该前缀为成员加上“ _my_type_private_”作为前缀,但是如果从内部实现文件中包含该头文件,则保持相同,因此类型不是不完整,但类型是更难于意外修改结构)
编辑:该问题不是该问题的重复,但确实提供了正确答案:
此外,如果[对于每对成员声明]一对中的一个成员用一个名称声明,而另一个成员用相同的名称声明,则在单独的翻译单元中声明的两个结构,联合或枚举类型兼容。 >
因此它们不是兼容类型。
答案 0 :(得分:4)
C 2018 6.2.7 1指定了在单独的翻译单元中声明的两种结构类型要兼容(加重)的条件:
…此外,如果两个结构,联合或枚举类型的标签和成员满足以下要求,则它们是兼容的:如果它们的标签和成员满足以下要求:如果一个声明有标签,则另一个应声明相同的标签。如果两者都在各自翻译单元内的任何位置完成,则适用以下附加要求:成员之间应存在一对一的对应关系,以使每对对应的成员声明为兼容类型;如果该对中的一个成员是使用对齐方式说明符声明的,则另一个使用等效的对齐方式说明符声明;和如果该对中的一个成员声明了名称,则另一个成员声明了相同的名称…
由于struct my_struct
在不同的翻译单元中声明了不同的成员名称,因此一个翻译单元中的struct my_struct
与另一翻译单元中的struct my_struct
不兼容。
这将导致在一个翻译单元中声明的my_struct_init
和其他功能与在另一翻译单元中声明和定义的my_struct_init
和其他功能不兼容。