预编译文件,预编译头文件认识

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

时间: 2024-11-07 10:52:46

预编译文件,预编译头文件认识的相关文章

C预编译, 预处理, C/C++头文件, 编译控制,

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数. (1)message 参数. Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输

NDK编译c包含C++头文件 error: unknown type name 'class' 的解决方法

在进行native开发的时候,难免会遇到C文件包含C++头文件而调用C++函数,若没做什么处理,直接include进行编译的话,会遇到以下错误: error: unknown type name 'class' error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token 那么怎么解决呢? 首先,找下报错的原,从C以及C++特性不难发现:C文件include了带有C++关键字的头文件,如class等,因此,包含C

.m文件导入C++头文件带来的错误

这几天的工作挖了不少的坑,遇到了各种千奇百怪的错误,现在好好总结一下. 新建一个工程,然后新建HelloCPP.h,HelloCPP.cpp文件,HelloCPP.h文件内容如下: #ifndef __CPPWrong__HelloCPP__ #define __CPPWrong__HelloCPP__ //#include <stdio.h> namespace hello { }; #endif /* defined(__CPPWrong__HelloCPP__) 就一个空的namespa

关于file文件操作的头文件 【LINUX】 (转载)

转自:http://blog.csdn.net/figo77ll/article/details/3156052 Linux下如果要对文件进行读取访问,需要包含至少以下两个头文件: #inlcude <unistd.h> #inlcude <fcntl.h> 其中fcntl.h包含了create和open命令,unistd包含了其他的诸如read, write, close等命令.很奇怪为什么不把fcntl的功能直接放到unistd里面呢.. 如果要对STDIN,STDOUT进行“

gcc/clang编译带pthread.h头文件的源码时需要的参数

今天敲了一个小程序,编译时出现错误:undefined reference pthread_create 原来由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:gcc -o test -lpthread test.c 再查发现编译时参数写成 -pthread 也是可以的.  * 经反复调试,此代码在多核环境下不安全,可能出现多个线程同时访问共享变量, * 即线程a将cou

xcode 编译错误的 之 头文件 包含成.m了

duplicate symbol _OBJC_CLASS_$_AutoTableViewViewController in: /Users/apple/Library/Developer/Xcode/DerivedData/masonry自动布局-cragjuqaxcsyhcckrysbcptlqprh/Build/Intermediates/masonry自动布局.build/Debug-iphonesimulator/masonry自动布局.build/Objects-normal/i386

hpp头文件与h头文件的区别

hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库. hpp的优点不少,但是编写中有以下几点要注意: 1.是Header   Plus   Plus 的简写. 2.

C++ 标准头文件与C头文件区别与联系以及C风格字符串

1.cstdlib是C++里面的一个常用头文件, 等价于C中的<stdlib.h>. 2.一般一个带".h" 扩展名的库文件,比如iostream.h.这是延续C语言的,为了兼容C.在新标准的库中都有一个 不带".h"扩展名的相对应,区别除了后者好多改进之处,还有一点就是后者的东西都放进了"std"名字空间中. 但是 string.h有点特别,问题在于C++要兼容C的标准库,C的标准库里也有一个名字叫做"string.h&q

C语言 文件操作的头文件

计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流.在C语言中用一个指针变量指向一个文件,这个指针称为文件指针.通过文件指针就可对它所指的文件进行各种操作,C语言规定该文件指针类型为FILE型.文件的信息有这个FILE型的结构体来进行定义. FILE的结构体的定义如下 typedef struct { short level; // 缓冲区“满”或“空”的程度 unsigned flags; // 文件状态标志 char fd; // 文件描述符 un

在 ubuntu 下编译 android 找不到头文件问题解决

在 ubuntu 下编译 android 的时候, 发现编译错误, 有些头文件找不到, 如: 致命错误: alsa/asoundlib.h: 没有那个文件或目录 网上搜索了一下, 原因是某些库没安装导致. 可以使用 apt-file 查看该头文件在什么库中, 找到相应的库, 安装即可. 安装 apt-file : sudo apt-get install apt-file 查找头文件: apt-file search 头文件, 如: apt-file search alsa/asoundlib.