头文件和编译的问题

华为机考题

如果a.c包含了头文件a.h,a.h包含了头文件b.h, b.c 也包含了b.h,那么当b.h发生改变时,哪些文件会被重新编译?
  • b.c
  • a.h
  • a.c和a.h
  • a.c和b.c
上述问题的答案选最后一个,自此衍生出以下知识点:
(1)为什么只有.c文件,而没有a.h文件,即头文件会被编译吗?

答: 头文件不会被编译,编译器只编译源文件。这是因为编译的第一个阶段:预处理的职责就是1. 展开#define宏定义,以及2. 处理#include,将被包含的文件直接插入到预编译指令的位置,此外,3. 预处理还包括删除注释等。
因此头文件会在预编译阶段就被编译器在源文件中展开了,所以自然不会被编译。

(2)为什么a.c和b.c文件都被重新编译了呢?

答:因为一旦修改头文件,所有包含该头文件的文件都要重新编译。所以a.c 中包含的a.h里,包含了b.h,那么不论往下包含了多少级,牵一发而动全身,都需要重新编译。

(3)延伸:如何避免修改头文件时导致项目重新编译呢?

答:有两个方案,一个是增量编译;另一种是针对类使用的,将引用改为指针,添加前向声明的方法
方法二即通过减少在头文件中包含其他头文件的方法来降低重新编译消耗。头文件中将添加前向声明,引用改为指针,函数在源文件的实现时再添加类的头文件。具体看该链接

(4) 延伸:复习什么是前向声明

答:有类的前向声明和函数的前向声明,主要是为了告知编译器实际定义标识符之前告诉编译器标识符的存在。
可参考该链接

(5)延伸: 学习什么是增量编译

答:自我回答,简单概括就是只对修改过的文件进行编译,对未修改的文件不再重新编译,根据文件修改时间判断是否更新。细节可查看该链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值