C++预编译头文件(#include "stdafx.h")

来源:http://blog.sina.com.cn/s/blog_4ac766c00100qsbd.html

http://blog.csdn.net/txh0001/article/details/7031058

作为一个C++菜鸟,在预编译头文件(#include "stdafx.h")上纠结了很久,今天打算彻底弄明白它。

1.预编译头文件的概念

所谓的预编译头文件,其实我们很熟悉的,这里的头文件(Microsoft Visual C++中)一般的说就是我们常见的stdafx.h。这个名字是微软默认的,名字还可以改,内容更加可以改。这个就是待编译的头文件,但是,我们知道,头文件是不能被编译的,因此,我们就可以用一个stdafx.cpp,这个文件中一开始可以没有内容,但必须加一句“include<stdafx.h>”,然后compile(ctrl+F7)一下就可以出现一个(.pch)文件,这个就是我们常说的预编译头文件。

为什么需要预编译头文件呢?原因很简单,这个其实这么做的目的就是减少编译时间。因为,如果不是这么做的话,在编译的时候,假如一个头文件被很多的文件使用,那就费时了,因为得一次又一次地进行编译。而有了预编译头文件的话,我们把出现频率很高的那部分东西(通常是一些系统的头文件或者是一些自己设定的但是不常变动的头文件)已经编译好了,就像一个通用零件一样,已经搞好了,用到的时候就直接装就行。这样就可以利用编译好的成果,从而能非常有效地节约编译的时间了。

2.VS2008中的预编译头文件

打开VS2008,File->New->Project,建立一个Win32 console application,选择next,在Application Settings中的Additional options:中的Precompiled header默认勾选,点Finish,就可建立一个带预编译头文件的Win32控制台程序了。可以看到Solution explorer中有stdafx.h和stdafx.cpp,这两个东西就是用来生成预编译头文件的,也是微软默认的。

此时compile,会发现是不能成功的,错误是 fatal error C1083: Cannot open precompiled header file: ‘Debug×××.pch‘: No such file or directory。意思就是没有.pch文件。如上面所说,其实编译的过程是利用预先编译好的预编译头文件来减少编译的工作量,那么既然没有这个预编译头文件,那怎么编译呢?我们可以在Solution explorer,右击工程,单击property,在右边的框中选择Configuration Properties->C/C++->Preprocessor,看到在右边的Create/Use Precompoled Header中默认的是Use Precompiled Header(/Yu),也就是说现在还没有建立.pch呢,就开始用了,显然不适合,那就改喽,单击之,选择Create Precompoled Header(/Yc),便可以了。编译之,可以看到在Debug文件夹中多了个.pch,也就是说这个预编译头文件搞定了。

再回到Create/Use Precompoled Header那页中,看到Create/Use Precompoled Header下面,Create/Use PCH Through File中是Stdafx.h,这里还是上面说的,一会编译器就默认用这个制作预编译头文件,制作完成的头问价放哪里呢,下面一个项是Precompoled Header File就是指示生成的.pch的地址的,其默认的地址是$(IntDir)$(TargetName).pch(这里的$表示当前工程文件夹,$(IntDir)表示当前文件夹的Debug文件夹,下拉点edit可以看到类似IntDirOutir之类的地址目录),生成在Debug目录下,名称是(工程名).pch。这里,可以改下,自己edit下,把$(TargetName).pch改为PPP.pch,编译一下,可以看到Debug下出现了一个PPP.pch,这个是新的预编译头文件,系统会自动的为你添加进去,以后自动用它进行的编译的。但是,有一点,就是刚才的那个预编译头文件并没有消失,还挺大的呢,得几个M,也就是说,原来的头文件没有用了,但是并没有覆盖掉,那么这就提醒我们要及时清理没有用的头文件了。

再有就是既然已经Create了个预编译头文件了,那么以后就不要总是Create了,我们就要把Create/Use Precompoled Header中的改回Use Precompiled Header(/Yu),然后就可以节约编译时间了。

3.什么情况下使用预编译头文件

前面也有所提及,这里我自己系统地总结下:

1)一些大型程序用这个比较好,但是一些小型的不点行的程序还是不要用预编译头文件的好,因为Create一个预编译头文件本身也是要时间的。

2)预编译头文件中一般只放系统头文件。比如说你使用MFC,很多的头文件就必须要来回地用,这时,不要你操心,系统就会默认地给你弄个预编译头文件,来成倍地节约编译时间。

3)自己编的一些很常用的基本固定不变的头文件。其实,我倾向于这么做,就是我们自己搞一个预编译头文件,用自己的名字,然后可以把系统的Stdafx.h包含进去。注意这么做的话,千万要用自己的另外定义的名字。如果你在Stdafx.h里面包含自己的头文件,结果会把下家(看程序的人)迷糊了,因为我们习惯上在自己编的头文件中以“另可错杀一百,不可放过一个”的原则来包含预编译头文件,假如别人来使用这个头文件,那他可惨了,编译器会把这个当普通文件编的,那可不是节约时间了,那是在浪费时间。

4、预编译头文件使用经验:

如果预编译头文件被正确使用时,它确实大大提高我们编程的效率(你工作中,有多少时间是在等编译完成?很多吧,这个时候一般都很无聊,无奈,浪费时间)。但是他太容易用错了. 下面是几种常见的错误用法.

1) 在预编译头文件里include自己的头文件

原因:自己的头文件一般会经常变, 便利后导致预编译的东东重新编译, 降低了编译速度,当然, 如果你的头文件不经常变化, 也可以

2) 在其他的头文件里也include 预编译头文件

假设你的其他头文件也include了预编译头文件, 如果别人引用你的这个头文件又没有设置成预编译头文件, 那引用你头文件的这个人就煎熬了.

原 因:由于你用到的.h文件里include了预编译头文件,他在他本身的project里,vs能够判断的出他是预编译头,也能找的到需要的pch, pdb文件。所以对写这个.h文件的人没影响。但是你作为他的客户,你工作在你的project下,你include了他的h头文件,而这时vs判断不出 他的头文件里include的stdafx是预编译头文件,做普通文件编。那可想而知,他的stdafx里如果有import外面大型的库(如 inventor的tlb,非常慢,我们犯了这个错),那编译速度简直是煎熬。最要命的是,以后你做任何简单的修改都要重编,这和预编译解决的问题恰好相 反了。

下面给出一个使用预编译头文件的操作步骤, 享受一下预编译头文件给我们带来的编译速度的提升:

1) 添加一个stdafx.h文件(名字随便取, 这里用了VS默认提供的名称), 在这个.h文件里include要使用的头文件(一般是外部的库, 自己写的不常变的头文件也可以加进来)

2) 添加一个stdafx.cpp文件, 并include "stdafx.h"

3)项目属性-->c/c++-->Precompiled设置为Use Precompiled Header, stdafx.h

4)stdafx.cpp属性-->c/c++->Precompiled设置为Create Precompiled Header, stdafx.h

done!

5、预编译头的使用

要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)

想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC

Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:

#include <afxwin.h>         // MFC core and standard components

#include <afxext.h>         // MFC extensions

#include <afxdisp.h>        // MFC Automation classes

#include <afxdtctl.h>       // MFC support for Internet Explorer 4 Common Controls

#include <afxcmn.h>

这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。

那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:

#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已―――也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译

开关来指定生成的pch文件的名字。打开project ->Setting->C/C++ 对话框。把Category指向Precompiled Header。在左边的树形视图里选择整个工程,在图中我们的Project Options(右下角的那个白

的地方)可以看到 /Fp “debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 <工程名>.pch

然后,在左边的树形视图里选择StdAfx.cpp,这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定

这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件。

在命令行里,我们可以看到/Yu"stdafx.h" /Fp"Debug/DepModify.pch"

然后我们再选择一个其它的cpp文件来看看,在这里,Precomplier 选择了 Use ………一项,头文件是我们指定创建PCH 文件的stdafx.h文件。事实上,这里是使用工程里的设置,(如图

1)/Yu”stdafx.h”。

这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。

以下是注意事项:

1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头(我强调一遍是最开头)包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告

诉你Unexpected file end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果…

2)如果你把pch文件不小心丢了,根据以上的分析,你只要让编译器生成一个pch文件就可以了。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍就可以了。当然你可以傻傻的 Rebuild

all。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。

时间: 2024-10-05 07:41:02

C++预编译头文件(#include "stdafx.h")的相关文章

C++预编译头文件:stdafx.h

其实在我们的生活中,很多东西都是这样,出现一次两次,而往往被我们忽略.碰见多次,终有一天被我们注意到,然后想弄个明白.又或许是注意到了,然而也并没有要去弄个明白的心.终有一天它给你困惑,而不得不去弄明白.不管stdafx.h你有没有注意到,不管stdafx.h有没有给你困惑,现在我们就来了解一下预编译头. 什么是预编译头 预编译头(precompiled header)是程序设计时把头文件编译为中间格式,以节约在开发过程中编译器反复编译该头文件的开销.——来自<维基百科> 可见预编译头的意义就

预编译头文件stdafx.h-stdafx.cpp-stdafx.pch(pre-compile headfile)

tdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展). 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H.Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果.这样可以加快编译速度,节省时间. 简介 编辑 预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是"pch",所以编译结果文件是

预编译头文件 StdAfx.h

预编译头文件: 最常见的使用场景就是 StdAfx.h 文件,在这个文件中包含常用的头文件,比如windows.h,cstdio,string,别的 .cpp 文件去包含 StdAfx.h 头文件.编译的时候 StdAfx.h 尽管被多个 .cpp 包含,但只会编译一次.加快了编译速度. StdAfx.cpp 专门用来生成预编译文件,StdAfx.cpp 里只有一行代码 #include "StdAfx.h", 编译 StdAfx.cpp 会产生一个 .pch 文件.别的 .cpp 文

C++预编译头文件

以前只是学过C++中的预编译头文件,但一直没用过:既然今天又遇到了这个问题,所以还是决定写点总结 算是做个笔记吧! 在C++中之所以出现预编译的概念主要是因为在C++项目中导致整个程序的编译过程变得很缓慢的一个很重 要的原因就是C++头文件的存在,在每一个.cpp文件中都会包含许多.h的头文件,如果所包含的头文件过多或过大 就会导致.cpp文件过大而编译缓慢,但是事实上在许多.cpp中所包含的头文件都是重复出现的,即有很多头文件被 重复编译了许多次,这当然会导致项目整体的编译速度变慢. 为了解决

预编译文件,预编译头文件认识

一.概念:1.预编译:就是编译器首先编译某个文件(称为预编译头文件),然后将这个编译结果保存起来,之后如果有其他源文件include了这个“预编译头文件”的时候,则自动从这个编译结果提取需要的信息进行编译.2.预编译结果文件(Precompiled header file):就是那个用来保存已经编译了的符号信息的文件(.PCH作为后缀)3.生成预编译结果文件(Create Precompiled header file):我们说源文件A通过文件B“生成预编译结果文件”是指编译A的时候将其中编译B

C/C++混合编程出现:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)问题的解决方案

今天试了一下C/C++混合编程,然后就出现了上面那个蛋疼的问题,去网上查了一下,发现原来是C语言和C++预编译头的问题. error:预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反) 英文版:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ a

codeblocks + MinGW 以及vc 使用预编译头文件的方法

MinGW编译器: 1.打开工程文件,在工程文件浏览其中,在你要设置为预编译的头文件上,点击鼠标右键,选择“属性(properties)”  你会看到一个多页面的属性框,选择“构建(build)”页面,将“编译文件(complie file)”选项勾上,其默认状态为没有勾 2.从菜单->工程(project)->构建选项(build options)  会跳出一个多页面属性框,在此你选择工程全局设置(project name),注意不是调试(debug)或者发布(release),然后“编译器

VS2005 MFC 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)

当 Visual C++ 项目启用了预编译头 (Precompiled header) 功能时,如果项目中同时混合有 .c 和 .cpp 源文件,则可能收到 C1853 编译器错误:fatal error C1853: 'pjtname.pch' precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from

fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”:No such file or directory

一.解决方法 右键点击你创建的项目,选择“属性标签”点击属性,弹出“项目属性页”,在左侧找到以下位置  配置属性 -->  C/C++  --> 预编译头,并选择它:在右边的菜单中选择 “创建/使用预编译头”中的“不使用预编译头文件”点击“确定”按钮退出即可. 二.原因分析 编译器一般都是以文件为单位进行编译,如果修改了工程中的一个文件,那么将导致所有文件都要从新编译,这样的编译将耗费很长时间.      为了提高编译速度,将那些不常被修改,比较稳定,文件单独包含到一个指定的头文件中, 然后生