预编译头的问题

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还生效,因为在预编译头中还有。这个有时候会给开发的人带来一些困扰。






预编译(Precompiled Header)是一种优化编译时间的技术。它可以将一些常用的文件预先编译好,然后在编译源文件时直接使用预编译好的文件,从而加快编译速度。 在 Visual Studio 中,预编译相关的属性配置都在“C/C++” -> “预编译”选项卡中。这些属性包括: - 预编译文件(Precompiled Header File):指定预编译文件的名称,默认为“stdafx.h”。 - 预编译生成器(Precompiled Header Output File):指定在生成预编译文件时要使用的 .cpp 文件,默认为项目的主 .cpp 文件。 - 预编译类型(Precompiled Header Mode):指定预编译的生成方式,有“使用”和“创建”两种选项。 - 预编译使用(Use Precompiled Header):指定是否启用预编译功能。 其中,最重要的属性是“预编译文件”,它指定了预编译文件的名称。默认情况下,Visual Studio 会自动生成一个名为“stdafx.h”的预编译文件,并在需要使用的源文件中包含该文件。如果你想使用其他名称的预编译文件,需要手动修改该属性。 另外,预编译生成器和预编译类型也需要根据项目的实际情况进行配置。如果你的项目中只有一个 .cpp 文件,可以将预编译生成器设置为该文件;如果有多个 .cpp 文件,可以选择项目的主 .cpp 文件作为预编译生成器。预编译类型可以根据项目的实际情况选择“使用”或“创建”两种方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值