一、概念:

1、预编译:就是编译器首先编译某个文件(称为预编译头文件),然后将这个编译结果保存起来,之后如果有其他源文件include了这个“预编译头文件”的时候,则自动从这个编译结果提取需要的信息进行编译。

2、预编译结果文件(Precompiled header file):就是那个用来保存已经编译了的符号信息的文件(.PCH作为后缀)

3、生成预编译结果文件(Create Precompiled header file):我们说源文件A通过文件B“生成预编译结果文件”是指编译A的时候将其中编译B的编译结果保存成预编译结果文件。一般使用向导的话,A文件就是“stdafx.cpp”,B文件是“stdafx.h”。stdafx.cpp中就一行语句:

#include “stdafx.h”

4、使用预编译头(Using precompiled header):我们说某个源文件(a.cpp)通过“stdafx.h”来使用预编译结果是指编译a.cpp的时候,如果a.cpp第一行include语句是#include “stdafx.h”的话,那么直接取预编译结果文件的结果,不再重新编译”stdafx.h”

二、向导是怎么做的?

1、设置“stdafx.cpp”的预编译选项是通过“stdafx.h”文件来“生成预编译结果文件”。

2、其他源文件的预编译选项设置是通过“stdafx.h”来“使用预编译头”

三、使用原则?

1、将相对稳定的头文件(比如CRT,STL,第三方固定的库)全部写在stdafx.h中。(是否使用stdafx.h依赖个人喜好,不过使用stdafx.h可以和向导保持一致)

2、全部源文件第一行都加#include “stdafx.h”。

3、一些不能修改的源文件(如果公共的代码,不具备权限修改的代码),设置他的预编译选项是“不使用预编译头”。注意,一定不能是选择“自动生成预编译头”,因为这样会将stdafx.h的结果冲掉(这个不知道是BUG还是设计的问题了,.^_^。)。

四、Q&A

Q、为什么不全部使用“自动生成预编译头文件”?

A、“自动生成预编译头文件”和什么都不用没有什么两样,编译速度没有质的提高。

Q、手工添加一个新的源文件到项目的时候,经常出现类似错误:

fatal error C1010: unexpected end of file while looking for precompiled header directive

A、因为向导缺省的设置是“使用预编译头”,但是你新加的文件并没有在第一行包含“stdafx.h”。解决的方法要么修改成“不使用预编译头”,要么添加一行#include “stdafx.h”

Q、加stdafx.h和stdafx.cpp总觉得是和编译平台绑定了,不具备移植性?

A、其实,注意一下stdafx.h的写法就没有问题了。我的解决方案是(stdafx.h的内容):

–begin of file stdafx.h

#ifdef _WIN32

#include “win.h” // 泛指window下的公共头文件

#else

#include “linux.h” // 泛指linux下的公共头文件

#endif

#include “crt.h” //泛指c标准库

#include “stl.h” //泛指STL库

–end of file

或者更加简单一点,如果不是VC编译器,那么stdafx.h就什么内容都不写!

错误描述:fatal error C1010 : 在 查找 预编译 头时 遇到 意外 文件 结尾 是否 忘记 向源 添加 “# include std afx .h””? 分析:属性项 预编译 设置了使用 预编译 头,但是实际 文件 并没有 添加 该头 文件 ,因为项目使用了MFC相关类,所以如果不使用 预编译 文件 ,将导致每次编译时间过长,查了下资料,如果某个cpp 文件 没有使用 预编译 文件 ,那么单独将该 文件 属性项选择不使用 预编译 头即可。 参考:https://www.cnblogs.com/dcybook/p/8558261.htm error C1010 : 在 查找 预编译 头时 遇到 意外 文件 结尾 是否 忘记 向源 添加 “# include " Std Afx .h"”? 一、错误描述 fatal error C1010 : 在 查找 预编译 头时 遇到 意外 文件 结尾 是否 忘记 向源 添加 “# include " std afx .h"”? 二、错误分析 此错误发生的原因是编译器在寻找 预编译 指示头 文件 (默认# include " std afx .h")时, 文件 未预期结束。没有找到 预编译 指示信息的头 文件 " std afx .h"。 (因为工程 的每个cpp 文件 属 错误描述:fatal error C1010 : 在 查找 预编译 头时 遇到 意外 文件 结尾 是否 忘记 向源 添加 “# include " std afx .h"”? 错误分析:     此错误发生的原因是编译器在寻找 预编译 指示头 文件 (默认# include " std afx .h")时,文 导入.h .cpp 文件 ,编译报错,查了好多回答都是说.cpp使用 预编译 头,但是.cpp已经包含了# include " std afx .h";并且右键属性也选择了使用 预编译 头,依然报错,后来分析发现生成的moc 文件 没有# include " std afx .h";找到以下方式修” 现象分析:生成的moc 文件 没有# include " std afx .h"语句,并且源 文件 的.cpp 正常引用了# include " std afx .h"; 原因:在生成moc 文件 时没有配置包含 预编译 std afx .h; 解决方法:在.h 文件 , 错误描述:fatal error C1010 :在 查找 预编译 头时 遇到 意外 文件 结尾 是否 忘记 向源 添加 “# include " std afx .h"”? 错误分析: 此错误发生的原因是编译器在寻找 预编译 指示头 文件 (默认# include " std afx .h")时, 文件 未预期结束。没有找到 预编译 指示信息的头 文件 " std afx .h"。 (因为工程 的每个cpp 文件 属性默认都是使用 预编译 头(/YU)的 错误描述:fatal error C1010 :在 查找 预编译 头时 遇到 意外 文件 结尾 是否 忘记 向源 添加 “# include " std afx .h"”? 错误分析:     此错误发生的原因是编译器在寻找 预编译 指示头 文件 (默认# include " std afx .h")时, 文件 未预期结束。没有找到 预编译 指示信息的头 文件 " std afx .h"。    (因为工程 的每个cpp 文件 属性默认都是使用 预编译 # include " std afx .h" 编译器在寻找 预编译 指示头 文件 (默认# include " std afx .h")时, 文件 未预期结束,没有找到 预编译 指示信息的头 文件 " std afx .h"。 VC的 预编译 技术:http://blog.csdn.net