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

yumo6663周前 (06-30)技术文章6


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





编译器理论和实作

既是又不是。

  • 从编译器理论理解,#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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。



相关文章

单片机c语言基础知识,c语言必背100代码有哪些?

我记得刚开始接触编程的时候,觉得太难了。也很好奇,写代码的那些人也太厉害了吧?全是英文的,他们的英文水平一定很好吧?他们是怎么记住这么多代码格式的?而且错了一个标点符号,整个程序都会有影响。一个程序几...

C语言项目实战:《飞翔的小鸟》零基础项目!190行源代码示例

这篇文章主要为大家详细介绍了C语言实现——《飞翔的小鸟项目》文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!游戏介绍:《Flappy Bird》其实是曾经流行的一款手机游...

C语言实现《贪吃蛇》小游戏!代码分享+思路注释

贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。 [1]贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式、赏...

C语言实现见缝插圆游戏!零基础代码思路+源码分享

《见缝插圆》顾名思义,就是在我们绘制的C语言窗口里面画随机圆,圆与圆之间不能相交或相切,那就要自己找“缝隙”咯!今天用C语言制一些漂亮的随机图案,如图所示,随机生成的圆互不相交且尽量填满画布,按空格键...

这两个简单的C语言宏定义,能够在程序运行前,找到错误代码

今天翻看 Linux 内核源代码时,发现两行非常有意思的C语言代码,如下:#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) #...

C语言开发:如何用130行代码,写出"超火"微信小游戏—羊了个羊?

近日,一款名为“羊了个羊”微信小游戏火爆全网。凭借简单玩法和不走寻常路的关卡设置,三消小游戏《羊了个羊》,成为《合成大西瓜》《召唤神龙》后的小微游戏新王者。“其实游戏很简单,就是凑齐三个一样的图案就能...