一、概念:
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就什么内容都不写!

转载:https://www.cnblogs.com/icmzn/p/5087537.html

预编译文件,预编译头文件认识相关推荐

  1. NDK编译c包含C++头文件时,出现 error: unknown type name 'class' 的解决方法

    在进行native开发的时候,难免会遇到C文件包含C++头文件而调用C++函数,若没做什么处理,直接include进行编译的话,会遇到以下错误: error: unknown type name 'c ...

  2. linux编译静态库的头文件,条件编译,头文件,静态库,共享库与多文件编程

    条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软件,当满足条件B时,编译除vip版本的软件,可以提高代码的复用率.条件编译使用&quo ...

  3. ROS自定义消息类型,编译无法生成 msg/srv 文件产生的头文件

    ROS自定义消息类型,编译无法生成 msg/srv 文件产生的头文件 参考博客: ros项目第一次编译无法找到msg/srv文件产生的头文件 message headers won't build f ...

  4. 在linux下面使用Jsoncpp,在编译时添加了头文件搜索路径-Ixxxx/json ,导致很多错误,如下: In file included from /usr/include/x86_64-li

    在linux下面使用Jsoncpp,在编译时添加了头文件搜索路径-Ixxxx/json ,导致很多错误,如下: In file included from /usr/include/x86_64-li ...

  5. C++声明、定义、类的定义、头文件作用、头文件重复引用

    转载至:点击打开链接 C++声明.定义.类的定义.头文件作用.头文件重复引用,不具名空间 转自:http://www.cnblogs.com/rocketfan/archive/2009/10/02/ ...

  6. gsoap 学习 1-由wsdl文件生成h头文件

    开始前先看一下用户向导吧 http://www.cs.fsu.edu/~engelen/soap.html 中左侧点击Documentation 英语水平确实有限,有些内容可能说的不准确,敬请参考向导 ...

  7. C语言 文件操作的头文件

    C语言 文件操作的头文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流.在C语言中用一个指针变量指向一个文件,这个指针称为文件指针.通过文件指针就可对 ...

  8. Linux C try 头文件,linux c 头文件

    //1.Linux中一些头文件的作用: #include //ANSI C.提供断言,assert(表达式) #include //GCC.GTK,GNOME的基础库,提供很多有用的函数,如有数据结构 ...

  9. hpp头文件和h头文件

    详解:C++ hpp头文件与h头文件-C++ hpp文件-嗨客网 个人见解: hpp只是为了让人知道这个文件声明和定义都在同一个文件,仅此而已.至于上面文章说的增加cpp和编译次数 1.完全可以用.h ...

  10. 每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

    全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量. 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对 ...

最新文章

  1. 深度学习的发展方向: 深度强化学习!
  2. 皮一皮:中国好男友?
  3. string.Format字符串格式化说明(转)
  4. sdut 2128 树结构练习——排序二叉树(BST)的中序遍历
  5. 北京内推 | 华为CloudAI机器视觉产品部招聘计算机视觉见习研究员
  6. boost::mpl::string相关的测试程序
  7. 学习Java软件开发该从何入手
  8. nginx 并发过十万
  9. linux upgrade tool使用_p4merge的使用
  10. 级联删除相关记录在哪_kube-apiserver审计日志记录和采集
  11. 如何用python画矿物分布地图_python怎么画出分布图?
  12. STM32F411移植FreeRtos教程
  13. 计算机专业寒假打工大一,大一学生寒假打工心得3篇
  14. 对抗机器学习——Min Max模型(Towards Deep Learning Models Resistant to Adversarial Attacks)
  15. 影视剧中十大经典反派台词!(来自大洋论坛)
  16. JDK的下载与安装(详细版)
  17. windows电脑给苹果电脑下ipa包
  18. 利用计算机的认识与感受制作海报,手绘pop海报在大学中的应用和现实意义
  19. Prometheus + Grafana + alertmanager实现Substrate区块链节点实时监控报警系统(上)
  20. es查询-统计总数以及深度分页

热门文章

  1. xp访问win10计算机名,xp连接win10共享打印机提示凭证不足怎么办
  2. 赛博朋克2077配置要求2022
  3. 九日集训 总结与展望
  4. 如何在国内开设美元账户进行美元投资?
  5. 系统监控——监控系统选型分析及误区探讨
  6. 深入理解函数式编程(下)
  7. java语言实现修改文件名称的功能
  8. eas库存状态调整单不能反审核_金蝶eas凭证无法审核
  9. 啥叫一个好售前​顾问
  10. 【转载】国内主要的量化交易平台及链接