概念:
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”
错误:
fatal error C1010: 在查找预编译头时遇到意外的文件结尾
原因:在编译的时候,我们使用了预编译头的功能,但是在一些cpp中,我们又没有使用到这些预编译的头文件,导致那些没有使用到的cpp出错。
解决方案:
1.将相对稳定的头文件(比如CRT,STL,第三方固定的库)全部写在stdafx.h中。(是否使用stdafx.h依赖个人喜好,不过使用stdafx.h可以和向导保持一致)。这是一种规范,相当于把当前工程对第三方的引用,集中到stdafx.h中。
2.全部源文件第一行都加#include “stdafx.h”。这样所以的cpp都使用到了预编译头文件了,也不会出现错了。
3.一些不能修改的源文件(如果公共的代码,不具备权限修改的代码),设置他的预编译选项是“不使用预编译头”。注意,一定不能是选择“自动生成预编译头”,因为这样会将stdafx.h的结果冲掉(这个不知道是BUG还是设计的问题了,.^_^。)。这个是针对一些第三方源文件的特殊情况来说的。
注意:上述做法只是对编译效率有所提升,对程序运行本身无特别影响。如果你选择自动生成预编译头文件,编译时会慢一点,你不会碰到上述错误,程序的运行也无影响。