美烦资源网

专注技术文章分享,涵盖编程教程、IT 资源与前沿资讯

C语言#include头文件真的是插入代码吗?


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!





编译器理论和实作

既是又不是。

  • 从编译器理论理解,#include头文件"相当于"插入了头文件的代码,以供源代码引用(宏定义、函数声明、其他头文件引入等等),这仅仅是理论的效果。利用GCC -E或者MSVC /E或/P选项可以看到"插入"的效果。
  • 从编译器实作角度,为了提高效率,编译器在编译源代码的时候并不会将#include头文件直接插入到当前编译的源代码,一则会产生代码插入,源代码所在的内存移动,二则不利于相同头文件的优化。主流编译器的做法是单独申请内存保存文件并记录#include行号以便处理完头文件后继续编译当前源代码。

引用大量头文件造成编译耗时灾难

  • 如果你看过windows.h或者看过C/C++/ObjC大工程,尤其源代码开头一堆头文件,修改某一个base头文件造成大量源代码被编译,鉴于此,C++20引入modules减少头文件包含编译时间,虽然Java/C#/Python早就抛弃头文件采用import module.
  • 预编译头文件以及头文件缓存都是头文件优化策略。
  • VS .pch和GCC的.gch都属于预编译头文件,注意一般选择稳定不会被经常改动的头文件。
  • 确认预编译头文件真的加速编译过程,在VS选项中可开启"生成计时"可查看编译过程各个工具消耗的时间。
    • 生成计时: "工具" -> "选项" -> "项目和解决方案" -> "VC++项目设置" -> "生成计时"










若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。



控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言