我已经在 SO 上阅读了关于外部/内部链接的现有问题。我的问题是不同的 - 如果我在 C
和 C++
下的不同翻译单元中有多个具有外部链接的同一个变量定义会怎样?
例如:
/*file1.c*/
typedef struct foo {
int a;
int b;
int c;
} foo;
foo xyz;
/*file2.c*/
typedef struct abc {
double x;
} foo;
foo xyz;
使用Dev-C++作为C程序,上述程序编译链接完美;而如果将其编译为 C++ 程序,则会出现多重重定义错误。为什么它应该在 C 下工作,与 C++ 有什么区别?此行为是否未定义且依赖于编译器?这段代码有多“糟糕”,如果我想重构它应该怎么做(我遇到过很多这样写的旧代码)?
最佳答案
C和C++都有一个“一次定义规则”,即每个对象在任何程序中只能定义一次。违反此规则会导致未定义的行为,这意味着您在编译时可能会或可能不会看到诊断消息。
以下文件范围内的声明之间存在语言差异,但它与您的示例的问题没有直接关系。
int a;
在 C 中,这是一个暂定的定义。它可以与同一翻译单元中的其他暂定定义合并形成一个单一的定义。在 C++ 中,它始终是一个定义(您必须使用 extern
来声明一个对象而不定义它)并且同一翻译单元中同一对象的任何后续定义都是错误的。
在您的示例中,两个翻译单元的暂定定义中都有一个(冲突的)xyz
定义。
关于c++ - C 和 C++ 之间的联系有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2026217/