C++ 预编译头文件
使用C++提供的预编译头文件支持,如果应用程序是很大的头文件,使用预编译头文件可以大大降低应用程序的编译时间。但预编译头文件是如何产生的,什么情况下需要预编译头文件,如何创建预编译头文件,预编译头文件在编译器中编译后会产生什么,使用预编译头文件需要注意什么,接下来针对于这些问题一一讲解。
(1) 预编译头文件产生原因
编译器在编译程序时所做的事情主要分为预编译,编译,汇编,和链接。而针对于预编译过程主要针对的是源文件中含有的“#”的指令,比如#include,#define进行展开,详细的说就是:
- 把所有的“#define”删除,并且展开所有的宏定义
- 处理所有的条件预编译指令,比如 “#if”“#ifndef”“#else”“#endif”
- 处理“#include” 将被包含的文件递归插入到预编译指令的位置,之所以递归是由于被包含的文件可能还包含其它文件
- 删除所有的注释,比如“//”“/**/”
这样就会存在一个问题就是,如果头文件相当的庞大,比如window.h甚至MFC库中所包含的各种头文件,如果将如此庞大的一个工程文件进行一一展开的话,编译的速度可想而知。
然而,时代的进步,人们发现,在某个工程中,总会有那些一些头文件几乎是所有的cpp所必须包含的,这样将这些头文件提取出来,然后编译,可以提高编译的速度。所以预编译就这样产生了。
(2) 创建预编译头文件
最为简单的例子,以vs2008为例,打开项目,File -> New -> Project,建立一个win32 console application ,直接下一步,成功后,编译其会默认产生一个stdafx.h和Stdafx.cpp。产生.cpp文件的原因仅仅是让它可以编译而已,头文件是不可以被编译的。所以stdafx.cpp中一般仅包含一个其头文件,
如果编译成功的话,在相对应的目录下会生成一个stdafx.pch的预编译头文件(.pch)。如果说,在编译程序的过程出现这样的问题:
fatal error C1083: Cannot open precompiled header file: 'Debug×××.pch': No such file or directory。
表示.pch文件未创建成功,可右击工程打开属性修改:
C/C++ -> 预编译头->创建/使用预编译头:创建预编译头(/Yc) 即可。
如果文件过小,我不想使用预编译头文件,或者出现这样的问题:
error C2857: 在源文件中没有找到用/Ycstdafx.h 命令行选项指定的“#include”语句
可将其该.cpp文件属性修改为“不使用预编译头”即可,或将其stdafx.h添加到相应的.cpp文件中即可。
(3) 注意事项
- 倘若工程较大,使用预编译头文件较好,加快编译速度。工程比较小,不推荐使用。但是创建预编译头文件后,第一次编译所花费的时间比后面的编译要稍微长些。
- 倘若.pch文件不小心丢失,只需要让编译器重新编译生成一个新的即可。
- 要确保放置在预编译头文件中的文件在工程开发时,不会被经常改变,否则的话,得不偿失。