加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C和C之间的联系差异?

发布时间:2020-12-16 05:44:40 所属栏目:百科 来源:网络整理
导读:我已经阅读了关于SO的外部/内部联系的现有问题.我的问题是不同的 – 如果我在C和C下的不同翻译单元中有相同变量的外部链接的多个定义会发生什么? 例如: /*file1.c*/typedef struct foo { int a; int b; int c;} foo;foo xyz;/*file2.c*/typedef struct abc
我已经阅读了关于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的(冲突的)定义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读