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单独编译好的目标文件中。链接器负责处理这种合并。