1, Visual Studio支持预编译头,因为随着现在工程量的级别越来越大,引用到的头文件越来越多,编译器在收到编译指令的时候,可能对某个文件编译出中间文件都耗费不少时间。因此产生了预编译头,也即是我们在工程中可以看到的.pch文件。
可以在工程的 属性页 | 配置属性 | C/C++ | 预编译头 这个地方看到预编译头的设置,如果第一项是”使用预编译头“,那么第二项就是VS会找的一个编译的第一个文件,这个编译过的文件会变成.pch放到工程相关的路径下面,如果跟预编译头中没有变化,那么工程编译的时候就会直接使用.pch,而不再解析相关的.h。这个方式在很大的程度上,缩短了每次编译的时间。
需要注意的是,在使用预编译头的情况下,如果有对某个C/C++文件进行单独编译的情况,可能会遇上编译不过的事情。很常见的是,某个C++文件,改动了相应的.h和.cpp,这个.h在预编译头中有,这种情况如果单独编译,很有可能就编译不过,因为.pch中没有改动,.h的改变没有进入.pch。
解决方式很简单,对这种情况,不能单独编译该cpp文件, 而要在工程上点编译,这样编译器会检测到因.h改变而需要重新编译预编译头,从而正确编译。
2, 预编译头有时候会产生 “fatal error C1083"的错误,这里是引用自 http://hi.baidu.com/xicao54007/item/d1a4bd3144ffd9179dc65e2a 的一段文字,说明该问题和解法:
stdafx.cpp右键——属性,预编译头选“创建”,其它cpp选“使用”。 如何使用预编译头文件以提高编译速度?
要使用预编译头文件,必须指定一个头文件(.H),它包含我们不会经常修改的代码和其他的头文件,然后用这个头文件来生成一个预编译头文件(.PCH),VC默认的头文件就是StdAfx.h,因为头文件是不能编译的,所以我们还需要一个.CPP文件来作桥梁,VC默认的文件为StdAfx.cpp,这个文件里只有一句代码就是:#include "StdAfx.h"。接下来要用它生成.PCH文件,涉及到几个重要的预编译指令:/Yu,/Yc,/Yx,/Fp。简单地说,/Yc是用来生成.PCH文件的编译开关。在Project->setting->C/C++的Category里的Precompiled Header,然后在左边的树形视图中选择用来编译生成.PCH文件的.CPP文件(默认即StdAfx.cpp),你就可以看到/Yc这个开关,它表示这个文件编译了以后是否生成.PCH文件(可能/Yc的c表示create)。/Fp指令指定生成的.PCH文件的名字及路径(可能/Fp的p代表path)。/Yu的u即use,工程中只要包括了.H文件的文件都会有这个/Yu指令。如果选择自动Automatic...的话则原来为/Yc的地方就换成了/Yx指令。如果选择自动,则每次编译时编译器会看以前有没有生成过.PCH文件,有则不现生成否则就再次编译产生.PCH文件。
3, 预编译头带来的宏编译问题
如果预编译头里面用上了宏开关,那么可能也会给开发者带来一些问题。举个例子,在VC的环境中,_DEBUG这样的预定义宏一般是放在工程设置中的,但很多第三方库会在某个自己的头文件中明示该宏,这样如果你在你的工程中包含该第三方的东西做预编译头,那么即使你取消了工程中的_DEBUG,实际上_DEBUG还生效,因为在预编译头中还有。这个有时候会给开发的人带来一些困扰。