当前位置:  开发笔记 > 编程语言 > 正文

是否允许不同的翻译单元定义具有相同名称的结构?

如何解决《是否允许不同的翻译单元定义具有相同名称的结构?》经验,为你挑选了1个好方法。

假设我有a.cb.c,它们都定义了被调用的类型struct foo,具有不同的定义:

#include 

struct foo {
    int a;
};

int a_func(void) {
    struct foo f;
    f.a = 4;
    printf("%d\n", f.a);
    return f.a * 3;
}

 

#include 

struct 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禁止这样做.)



1> M.M..:

结构标签是没有连接的标识符(C11 6.2.2/6)

关于没有链接的标识符的多个定义的规则在6.7/3中找到:

如果一个标识符没有联动,应当有所述标识符的使用相同的范围,并在相同的名称空间不超过一个声明(按照声明符或类型说明符),不同之处在于:

如果类型不是可变修改类型,则可以重新定义typedef名称以表示与其当前相同的类型;

标签可以按照6.7.2.3中的规定重新声明.

在您的程序中,两个声明foo属于不同的范围,因此不满足"具有相同范围"的条件,因此不违反此规则.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有