2009-04-29
对预编译头文件说明如下:
所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。
另外,每一个实现文件CPP都包含了如下语句:
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
这是表示,如果生成调试版本,要指示当前文件的名称。__FILE__是一个宏,在编译器编译过程中给它赋值为当前正在编译的文件名称。
下面是侯捷老师的说法:
2. 使用 AppWizard Project file 中想要加入 .cpp file
> 在 Compiling 过程会被要求请加入 "stdafx.h"
> 请问可以避免吗?
你是问「一个 project 之中可否不要 stdafx.h」吗?答案是可以,
但你的日子会从此更辛劳些。
随便看一个由 AppWizard 产生的 project,其 stdafx.h 内是一些
必要的 include files(例如 afxwin.h)。对应於 stdafx.h 则有
一个 stdafx.cpp,其内只是 #include "stdafx.h"。这有什麽用意?
用意是,让 stdafx.cpp 编译出一个 stdafx.obj,成为
所谓的 "pre-compile-header"(需搭配特殊 compile option。
AppWizard 会为我们的 project 自动设定这个特殊的 option),
可大幅降低第二次(以降)的编译所需时间(因为标准 MFC headers
不需再编译一次)。
往後,你每使用 ClassWizard 协助开发此程式,ClassWizard 便有
可能在 stdafx.h 中增加新的 include files。例如,你若选用
MFC template classes,stdafx.h 中便会增加 #include <afxtempl.h>。
如果你不要 afxstd.h,意味你得自己 take care 这些事情。
--- the end
最后要注意的是::
在声明包含stdafx.h的语句之前的语句都将被完全忽略。例如:
abcdefg
#include "stdafx.h"
能编译通过。
所以
#include <math.h>
#include "stdafx.h"
中,"math.h"也将被忽略。
避免上述错误的方法是将包含语句放在"stdafx.h"之后或者更好的方法是将其放在"stdafx.h"文件中。
网友评论