所谓的预编译头就是把一个工程中的某一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件。这些预先编译好的代码可以是任何的C/C++代码,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。生成预编译头文件很耗时间。预编译头文件通常很大,通常有6-7M大。应该及时清理那些没有用的预编译头文件。
编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西如宏等,都要重新处理一遍。VC的预编译头文件保存的正是这部分信息,以避免每次都要重新处理这些头文件。
预编译头的作用:
要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)
VC工程里的 StdAfx.h这个文件就是这样一个头文件,它是可以任意命名的,只不过VC的默认命名为StdAfx.h。我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。这个头文件里的内容一般如下:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__AC2D3C17_0808_4AB5_B6B7_CABF7808B0B7__INCLUDED_)
#define AFX_STDAFX_H__AC2D3C17_0808_4AB5_B6B7_CABF7808B0B7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#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
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__AC2D3C17_0808_4AB5_B6B7_CABF7808B0B7__INCLUDED_)
这里面包含的头文件正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说它们是稳定的。并且,StdAfx.h的位置必须在其它的包含的头文件之前,否则会出大量错误。
对于VC来说,单独一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。其作用仅仅就是要它具有.cpp的扩展名而能够被编译而已。可以用 /Yc编译器选项来指定某一个文件来生成一个相关的预编译头文件,通过 /Fp编译器选项来指定生成的pch文件的名字,通过 /Yu编译器选项来指定整个工程的相关预编译头文件。
编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西如宏等,都要重新处理一遍。VC的预编译头文件保存的正是这部分信息,以避免每次都要重新处理这些头文件。
预编译头的作用:
要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)
VC工程里的 StdAfx.h这个文件就是这样一个头文件,它是可以任意命名的,只不过VC的默认命名为StdAfx.h。我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。这个头文件里的内容一般如下:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#if !defined(AFX_STDAFX_H__AC2D3C17_0808_4AB5_B6B7_CABF7808B0B7__INCLUDED_)
#define AFX_STDAFX_H__AC2D3C17_0808_4AB5_B6B7_CABF7808B0B7__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#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
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__AC2D3C17_0808_4AB5_B6B7_CABF7808B0B7__INCLUDED_)
这里面包含的头文件正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说它们是稳定的。并且,StdAfx.h的位置必须在其它的包含的头文件之前,否则会出大量错误。
对于VC来说,单独一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。其作用仅仅就是要它具有.cpp的扩展名而能够被编译而已。可以用 /Yc编译器选项来指定某一个文件来生成一个相关的预编译头文件,通过 /Fp编译器选项来指定生成的pch文件的名字,通过 /Yu编译器选项来指定整个工程的相关预编译头文件。