当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>Visual C++教程

令人吐血的预编译头文件

    使用vc的人经常遇到fatal error C1083: Cannot open precompiled header file: 'Debug/xxx.pch': No such file or directory,怎么rebuild all都不行,这是删除了一些中间文件的结果。所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以。pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码——甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。

    现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(。eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。

    预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。

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

    AppWizard生成的MFC Dialog Based程序的预编译头文件。因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,其实是可以改变的。

    因为一个头文件是不能编译的。所以我们还需要一个cpp文件来生成。pch 文件。这个文件默认的就是StdAfx.cpp.在这个文件里只有一句代码就是:#include “Stdafx.h”。

    用/Yc编译开关来指定StdAfx.cpp来生成一个。pch文件,通过/Fp编译开关来指定生成的pch文件的名字。,/Yc的作用就是指定这个文件来创建一个Pch文件。

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

    正常的dsp文件包含StdAfx.cpp的这两行是这样的:

    SOURCE=.\StdAfx.cpp

    # ADD CPP /Yc"stdafx.h"

    # End Source File

    msdn的解释

/Yc  (Create Precompiled Header File)
Home | Overview | How Do I | Compiler Options
This option instructs the compiler to create a precompiled header (.PCH) file that represents the state of compilation at a certain point. (To find this option in the development environment, click Settings on the Project menu. Then click the C/C++ tab, and click Precompiled Headers in the Category box.)
Command Line Project Settings Description
/Yc Create Precompiled Header File The compiler compiles all code up to the end of the base source file, or to the point in the base file where #pragma hdrstop occurs. 
/Ycfilename Through Header The compiler compiles all code up to and including the .H file specified in the Through Header text box (filename). 

The precompiled code is saved in a file with a name created from the base name of the file specified with the /Yc option and a .PCH extension. You can also use the /Fp option to specify a name for the precompiled header file.
If you use /Ycfilename (Through Header), the compiler compiles all code up to and including the specified file for subsequent use with the /Yu option.
Note  If the options /Ycfilename and /Yufilename occur on the same command line and both reference, or imply, the same file name, /Ycfilename, takes precedence. This feature simplifies the writing of makefiles.
Example
Consider the following code:
#include <afxwin.h>  // Include header for class library
#include "resource.h" // Include resource definitions
#include "myapp.h"  // Include information specific to this app
...
When this code is compiled with the command
CL /YcMYAPP.H PROG.CPP
the compiler saves all the preprocessing for AFXWIN.H, RESOURCE.H, and MYAPP.H in a precompiled header file called MYAPP.PCH.
See Also  Creating Precompiled Header Files

    如果你把pch文件不小心丢了,编译的时候就会产生很多的不正常的行为。只要让编译器生成一个pch文件。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍。当然你可以 Rebuild All.一般就是选择那个cpp文件,按一下Ctrl + F7就ok了。

相关内容
赞助商链接