c语言学习-----代码的编译与链接(对obj重定义报错的探究

将写好的源文件(.cpp)通过编译器的处理生成可执行文件(.exe)的过程称之为翻译,其中包括编译和链接两个过程。
其中编译是将项目中的所有源文件(.cpp)通过编译器都分别单独生成一个目标文件(.obj)(不理解这个会产生一个重大的错误),随后,连接器会将项目中的所有目标文件链接起来,成为一个可执行文件。这就是翻译的过程。
在这里插入图片描述
这里说一下我曾经很喜欢犯的一个错误,这个错误就和编译的过程有关。
曾经我很喜欢在头文件中定义一个变量,总觉得这个变量是头文件中对实现头文件中的函数功能很有用,然后在编译的时候,经常出现“xxx已经在xxx.obj中定义”,起初我以为这是因为头文件的多次包含,所以我尝试使用“#ifndef”以及“#program once”来阻止头文件的多次包含,但事实是,重定义的报错仍然存在。
其实这里的重定义并不是我所想的那种重定义,“#ifndef”以及“#program once”的阻止头文件多次包含仅仅只是阻止在翻译的第一阶段,编译过程中,单个obj包含多次同一个头文件,而实际上,这里的报错结果是在链接过程中,多个obj包含同一个自定义头文件库造成的,就好像三个人要组成一个团队,每个人各有分工,结果来的时候发现每个人都拿了同样的铲子。
要解决的方法也很简单,就是在头文件中的变量,只使用extern声明,但是不定义,定义就到头文件对应的源文件去定义。
例如

//a.h
extern int num;
//a.cpp
int num = 0;

和头文件中的函数定义很像,不是嘛?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值