预编译头说明

1、解决什么问题?

  C++ 编译器是单独,分别编译的,每个cpp文件,进行预编译(也就是对#include,define 等进行文本替换),生成编译单元。编译单元是一个自包含文件,C++编译器对编译单元进行编译。考虑,头文件A.h被多个cpp文件(比如A1.cpp,A2.cpp)包含,每个cpp文件都要进行单独编译,其中的A.h部分就会被多次重复第编译,影响效率。

2、怎么解决?

  把A.h以及类似A.h这样的头文件,包含到stdafx.h中(当然也可以是其他文件),在stdafx.cpp中包含stdafx.h,设置stdafx.cpp文件的属性,预编译头设置为 创建。对于原先包含A.h的cpp文件,删除#include "A.h",改成包含stdafx.h,同时设置这些cpp文件(A1.cpp,A2.cpp)的属性,预编译头设置为 使用。这样的话,下次编译A1.cpp,A2.cpp的时候,对于A.h头文件中的那部分,就不需要编译了,节省时间。

3、预编译头文件原理

  工程对预先编译的代码进行编译,会生成一个pch文件(precompiled header),包含了编译的结果。注意,可以对任何代码生成到pch中,但是生成pch是个很耗时的操作,因此,只对那些稳定的代码创建预编译头文件。

 

编译系统说明:

例:取源程序hello.c 将其翻译成一个可执行目标文件hello.翻译过程分为四个阶段。

1)预处理阶段:预处理器根据以字符#开头的命令,修改原始的C程序。比如#include<stdio.h> 就是将它直接插入到程序文本中。

2)编译阶段:将文本文件hello.i翻译成文本hello.s 包含一个汇编语言程序。汇编语言为不同的语言的不同编译器提供了通用的输出语言。

3)汇编阶段:汇编器将hello.s翻译成机器语言指令,将指令打包成一个可重定位目标程序。

4)链接阶段:printf函数存在于一个名为printf.o单独编译好的目标文件中。链接器负责处理这种合并。

 

posted on 2017-04-26 10:23  123_123  阅读(262)  评论(0编辑  收藏  举报