C和C++之间的联系有何不同?

KC.*_*KC. 10 c c++ name-mangling

我已经在SO上阅读了有关外部/内部联系的现有问题.我的问题是不同的-如果我的情况下有不同的翻译单元外部链接的同一个变量的多个定义会发生什么CC++

例如:

/*file1.c*/

typedef struct foo {
    int a;
    int b;
    int c;
} foo;

foo xyz;


/*file2.c*/

typedef struct abc {
    double x;
} foo;

foo xyz;
Run Code Online (Sandbox Code Playgroud)

使用Dev-C++和C程序,上述程序可以完美地编译和链接; 如果将其编译为C++程序,则会产生多重重定义错误.为什么它应该在C下工作?与C++有什么区别?此行为是否未定义且依赖于编译器?这段代码有多"糟糕",如果我想重构它,我该怎么办(我遇到过很多像这样编写的旧代码)?

CB *_*ley 4

C 和 C++ 都有“一次定义规则”,即每个对象在任何程序中只能定义一次。违反此规则会导致未定义的行为,这意味着您在编译时可能会或可能不会看到诊断消息。

文件范围内的以下声明之间存在语言差异,但它并不直接涉及您的示例的问题。

int a;
Run Code Online (Sandbox Code Playgroud)

在 C 语言中,这是一个暂定的定义。它可以与同一翻译单元中的其他暂定定义合并以形成单个定义。在 C++ 中,它始终是一个定义(您必须使用它extern来声明一个对象而不定义它),并且同一翻译单元中同一对象的任何后续定义都是错误的。

在您的示例中,两个翻译单元的暂定定义都有一个(冲突的)定义xyz