预编译⽂件,预编译头⽂件认识
⼀、概念:
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下的公共头⽂件include怎么用
#endif
#include “crt.h”      //泛指c标准库
#include “stl.h”      //泛指STL库
–end of file
或者更加简单⼀点,如果不是VC编译器,那么stdafx.h就什么内容都不写!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。