前端之家收集整理的这篇文章主要介绍了
C和C之间的联系差异?,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经阅读了关于SO的外部/内部联系的现有问题.我的问题是不同的 – 如果我在C和C下的不同翻译单元中有相同变量的外部
链接的多个定义会发生什么?
例如:
@H_
502_4@/*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都有一个“一个定义规则”,即每个对象只能在任何程序中定义一次.违反此规则会导致未定义的行为,这意味着您可能在编译时可能看不到诊断消息.
在文件范围之间的以下声明之间存在语言差异,但它并不直接涉及您的示例的问题.
@H_
502_4@int a;
在C中,这是一个暂定的定义.它可能与同一翻译单位中的其他临时定义混合形成一个单一的定义.在C中它总是一个定义(你必须使用extern来声明一个对象而不定义它),同一个翻译单元中同一对象的任何后续定义是一个错误.
在你的例子中,两个翻译单元都有它们暂定定义中的xyz的(冲突的)定义.
原文链接:https://www.f2er.com/c/113852.html