预编译文件,预编译头文件认识
一、概念:
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
预编译文件,预编译头文件认识相关推荐
- NDK编译c包含C++头文件时,出现 error: unknown type name 'class' 的解决方法
在进行native开发的时候,难免会遇到C文件包含C++头文件而调用C++函数,若没做什么处理,直接include进行编译的话,会遇到以下错误: error: unknown type name 'c ...
- linux编译静态库的头文件,条件编译,头文件,静态库,共享库与多文件编程
条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软件,当满足条件B时,编译除vip版本的软件,可以提高代码的复用率.条件编译使用&quo ...
- ROS自定义消息类型,编译无法生成 msg/srv 文件产生的头文件
ROS自定义消息类型,编译无法生成 msg/srv 文件产生的头文件 参考博客: ros项目第一次编译无法找到msg/srv文件产生的头文件 message headers won't build f ...
- 在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 ...
- C++声明、定义、类的定义、头文件作用、头文件重复引用
转载至:点击打开链接 C++声明.定义.类的定义.头文件作用.头文件重复引用,不具名空间 转自:http://www.cnblogs.com/rocketfan/archive/2009/10/02/ ...
- gsoap 学习 1-由wsdl文件生成h头文件
开始前先看一下用户向导吧 http://www.cs.fsu.edu/~engelen/soap.html 中左侧点击Documentation 英语水平确实有限,有些内容可能说的不准确,敬请参考向导 ...
- C语言 文件操作的头文件
C语言 文件操作的头文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流.在C语言中用一个指针变量指向一个文件,这个指针称为文件指针.通过文件指针就可对 ...
- Linux C try 头文件,linux c 头文件
//1.Linux中一些头文件的作用: #include //ANSI C.提供断言,assert(表达式) #include //GCC.GTK,GNOME的基础库,提供很多有用的函数,如有数据结构 ...
- hpp头文件和h头文件
详解:C++ hpp头文件与h头文件-C++ hpp文件-嗨客网 个人见解: hpp只是为了让人知道这个文件声明和定义都在同一个文件,仅此而已.至于上面文章说的增加cpp和编译次数 1.完全可以用.h ...
- 每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量. 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对 ...
最新文章
- 深度学习的发展方向: 深度强化学习!
- 皮一皮:中国好男友?
- string.Format字符串格式化说明(转)
- sdut 2128 树结构练习——排序二叉树(BST)的中序遍历
- 北京内推 | 华为CloudAI机器视觉产品部招聘计算机视觉见习研究员
- boost::mpl::string相关的测试程序
- 学习Java软件开发该从何入手
- nginx 并发过十万
- linux upgrade tool使用_p4merge的使用
- 级联删除相关记录在哪_kube-apiserver审计日志记录和采集
- 如何用python画矿物分布地图_python怎么画出分布图?
- STM32F411移植FreeRtos教程
- 计算机专业寒假打工大一,大一学生寒假打工心得3篇
- 对抗机器学习——Min Max模型(Towards Deep Learning Models Resistant to Adversarial Attacks)
- 影视剧中十大经典反派台词!(来自大洋论坛)
- JDK的下载与安装(详细版)
- windows电脑给苹果电脑下ipa包
- 利用计算机的认识与感受制作海报,手绘pop海报在大学中的应用和现实意义
- Prometheus + Grafana + alertmanager实现Substrate区块链节点实时监控报警系统(上)
- es查询-统计总数以及深度分页