关于C/C++ 的源文件(.cpp)为什么要包含自己的头文件(.h)的思考

【】关于C/C++ 的源文件(.cpp)为什么要包含自己的头文件(.h)的思考

  • 目的:为了让编译器检验声明与定义(函数体)的一致性(尽可能让编译器帮我们发现错误)

我自己的理解:

  • 1、编译器是以文件为单位进行编译(同时进行编译检查)的
  • 2、对编译后的文件进行链接时,可能是以函数名(指针)来判断是否存在函数定义(实体)。

如果源文件不包含自己的头文件

会出现什么后果?(如果函数声明和函数定义(体)不一致,这个错误会被编译器发现吗?)

  • 首先,编译的时候,由于编译器按文件为单位进行编译,所以这一步编译器不会发现错误
  • 编译器对编译后的文件链接的时候:
    --------------如果函数声明和定义的不一致体现在函数名上,那么链接的时候可以检查出来,因为编译生成的函数指针(貌似编译器会根据函数名生成函数指针)都不一样,会报那种没有函数体的错误。
    --------------如果函数声明和定义的不一致体现在函数返回值或者函数参数上,那你就糟了,链接也无法检查出错误,编译器会以为他已经找到了函数体,链接完成。

但是当你执行exe文件时,可能就会发生错误,还难以检查。比如,你在 main.cpp 中包含 swap.h 中声明是这样的 int swap(int& a, int& b),而你在swap.cpp中的实际定义void swap(int& a, int& b) 或者是 void swap(int& a, int& b,int& c),使用 g++ .\main.cpp .\swap.cpp 编译链接可以通过并生成 exe 文件,但是执行 exe 显然很可能会发生什么错误。


如果源文件包含自己的头文件

,他们在一个文件中,在不使用函数参数一致的情况下,如果返回值你写的不一致,你在写代码的时候,编译器就会提醒你出声明与定义不一致。

如果函数参数也不一致,比如swap.h中是void swap(int& a, int& b),而swap.cpp 中是void(int& a, int& b, int& c),就算你swap.cpp 中包含 swap.h ,那么编译器也似乎彻底无能为力了(我猜测:有的编译器可能在链接的时候能够报出错误,这可能取决于编译器怎么处理函数,过于深入,我且止步于此),只能在执行的时候发现错误了…


总而言之,要做规范的事情,不要独辟蹊径,经验都是前辈们的血汗总结出来的!以此告诫自己。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值