分享

预编译和预编译头的概念以及使用

 Sophia_Study 2020-10-01

什么是预编译?

a,预编译就是在编译代码之前的一些先前的处理工作

b,处理一些以"#"开头的指令

      #inlcude "头文件"

      #define 宏定义

      条件编译等

预编译指令就是在正式编译之前由编译器编译一把的内容,可以放在程序的任何位置

C编译系统会在对程序进行统一的编译之前,会对预编译指令进行预处理

何时需要用到预编译?

a,总是经常使用不会改动或者不会进行大型改动的代码段

b,程序由多个模块组成,而且每一个模块都会使用到相同的头文件或者预编译的指令

这个时候我们就需要预编译技术,靠这个技术来生成预编译头。

什么是预编译头?

在实际的开发中,几乎好多的cpp文件都会包含一大堆相同的头文件,在编译器进行编译的时候,都会将这些头文件进行展开,然后进行编译,但是每一个cpp文件包含一遍就是展开编译一遍,所以当我们包含的头文件太大的时候,编译的速度就会贼吉尔慢,这个时候就需要预编译开生成预编译头,一次编译,全体通用。

当我们使用预编译技术之后,会在对应工程的Debug或者Release文件夹中找到一个:***.pch的文件(通常是这个后缀,至少我在windows上面的时候就是这个后缀),这个文件就是我们使用预编译生成的预编译头文件。

采用预编译之后,生成的预编译头文件就可以让每一个cpp文件进行使用,且不会像普通的头文件那样展开然后重新编译,预编译头文件是提前编译好然后加载到内存中去的。

但是随之而来的就会有有个问题:因为预编译的前提就是默认你的每一个cpp文件都会使用,所以当编译器发现你的cpp文件没有使用预编译头的时候,就会出现编译错误。因为编译器不知道怎么将已经编译好的东西从内存中挪出去,就会出现错误,此时只能将所有的cpp文件都使用预编译头。

作为生成预编译头的文件,应该有的特点就是:稳定,不会进行大的更改,甚至不会进行更改,因为编译一次预编译头文件的时间还是挺长的,生成的预编译头文件也挺大的,当包含的头文件有进行更改的时候,就需要重新编译生成一遍.pch文件。

这个时候也许有人就会问,现在的编译器不都是有时间戳的功能吗,每一次编译只去编译被修改的文件,对于没有被修改的文件,则保持之前的编译结果,但是如果被修改的文件里面使用的头文件很大,那么当我们只在cpp文件中修改一丢丢代码,编译器还是会全部重新编译,这样效率还是很低,所以就这个时候预编译即体现出了他的作用,预编译就是来处理这一部分信息。

怎么是使用预编译?

大家在windows编程的时候,在vs或者vc中见到名字叫:Stdafx.h的文件,好多人都会觉得这个一个系统级的头文件,其实他就是预编译文件,他可以换成任何的我们想要的名字。

使用预编译文件的的操作步骤如下:

1)添加一个头文件,名字随便起,这里我们借一下vc的名:Stdafx.h,这个头文件里面一般就是包含我们要使用的头文件,比如第三方库之类的,或者自己写的头文件

2)添加一个Stdafx.cpp文件,这个文件里面包含Stdafx.h文件

3)项目属性----->c/c++----->预编译头----->预编译头选项:“使用”,英文版的是:Use Precompiled Header, stdafx.h

3)Stdafx.cpp文件----->C/C++----->预编译头----->预编译头:“创建”,英文版的是:Create Precompiled Header, stdafx.h

结束。

一定要包含预编译头文件,然后运行工程。

然后在工程文件里面就可以生成.pch文件

参考资料:

https://blog.csdn.net/rl529014/article/details/51613941

https://blog.csdn.net/lovemysea/article/details/74858430

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多