具有相同名称和成员类型但具有不同成员名称的结构

时间:2019-01-23 15:12:31

标签: c data-structures struct types language-lawyer

在第一个编译单元中:

/* 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_”作为前缀,但是如果从内部实现文件中包含该头文件,则保持相同,因此类型不是不完整,但类型是更难于意外修改结构)

编辑:该问题不是该问题的重复,但确实提供了正确答案:

  

此外,如果[对于每对成员声明]一对中的一个成员用一个名称声明,而另一个成员用相同的名称声明,则在单独的翻译单元中声明的两个结构,联合或枚举类型兼容。 >

因此它们不是兼容类型。

1 个答案:

答案 0 :(得分:4)

C 2018 6.2.7 1指定了在单独的翻译单元中声明的两种结构类型要兼容(加重)的条件:

  

…此外,如果两个结构,联合或枚举类型的标签和成员满足以下要求,则它们是兼容的:如果它们的标签和成员满足以下要求:如果一个声明有标签,则另一个应声明相同的标签。如果两者都在各自翻译单元内的任何位置完成,则适用以下附加要求:成员之间应存在一对一的对应关系,以使每对对应的成员声明为兼容类型;如果该对中的一个成员是使用对齐方式说明符声明的,则另一个使用等效的对齐方式说明符声明;和如果该对中的一个成员声明了名称,则另一个成员声明了相同的名称

由于struct my_struct在不同的翻译单元中声明了不同的成员名称,因此一个翻译单元中的struct my_struct与另一翻译单元中的struct my_struct不兼容。

这将导致在一个翻译单元中声明的my_struct_init和其他功能与在另一翻译单元中声明和定义的my_struct_init和其他功能不兼容。