C和C之间的联系差异?

前端之家收集整理的这篇文章主要介绍了C和C之间的联系差异?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经阅读了关于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++相关文章