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

标签 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;

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

最佳答案

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

以下文件范围内的声明之间存在语言差异,但它与您的示例的问题没有直接关系。

int a;

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

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

关于c++ - C 和 C++ 之间的联系有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2026217/

相关文章:

c++ - 将模板方法作为参数传递

so 中的 C++ 名称修饰

c++ - C/C++ 中的字符串重整

c++ - 将 gzstream 与压缩文件一起使用时如何保持流位置?

c++ - 读取文件处理 C++ 时出错

c++ - 如何在不知道类型的情况下声明模板指针?

c - C中memcpy和等号之间的效率差异是多少?

c - 没有跳转表的switch语句

c - 从队列中使用 dequeue 方法时抛出异常

c++ - 在 OS/X (10.5.7) 中生成 C++ BackTraces