预编译头说明
1、解決什么問(wèn)題?
C++ 編譯器是單獨(dú),分別編譯的,每個(gè)cpp文件,進(jìn)行預(yù)編譯(也就是對(duì)#include,define 等進(jìn)行文本替換),生成編譯單元。編譯單元是一個(gè)自包含文件,C++編譯器對(duì)編譯單元進(jìn)行編譯。考慮,頭文件A.h被多個(gè)cpp文件(比如A1.cpp,A2.cpp)包含,每個(gè)cpp文件都要進(jìn)行單獨(dú)編譯,其中的A.h部分就會(huì)被多次重復(fù)第編譯,影響效率。
2、怎么解決?
把A.h以及類(lèi)似A.h這樣的頭文件,包含到stdafx.h中(當(dāng)然也可以是其他文件),在stdafx.cpp中包含stdafx.h,設(shè)置stdafx.cpp文件的屬性,預(yù)編譯頭設(shè)置為 創(chuàng)建。對(duì)于原先包含A.h的cpp文件,刪除#include "A.h",改成包含stdafx.h,同時(shí)設(shè)置這些cpp文件(A1.cpp,A2.cpp)的屬性,預(yù)編譯頭設(shè)置為 使用。這樣的話(huà),下次編譯A1.cpp,A2.cpp的時(shí)候,對(duì)于A.h頭文件中的那部分,就不需要編譯了,節(jié)省時(shí)間。
3、預(yù)編譯頭文件原理
工程對(duì)預(yù)先編譯的代碼進(jìn)行編譯,會(huì)生成一個(gè)pch文件(precompiled header),包含了編譯的結(jié)果。注意,可以對(duì)任何代碼生成到pch中,但是生成pch是個(gè)很耗時(shí)的操作,因此,只對(duì)那些穩(wěn)定的代碼創(chuàng)建預(yù)編譯頭文件。
?
編譯系統(tǒng)說(shuō)明:
例:取源程序hello.c 將其翻譯成一個(gè)可執(zhí)行目標(biāo)文件hello.翻譯過(guò)程分為四個(gè)階段。
1)預(yù)處理階段:預(yù)處理器根據(jù)以字符#開(kāi)頭的命令,修改原始的C程序。比如#include<stdio.h> 就是將它直接插入到程序文本中。
2)編譯階段:將文本文件hello.i翻譯成文本hello.s 包含一個(gè)匯編語(yǔ)言程序。匯編語(yǔ)言為不同的語(yǔ)言的不同編譯器提供了通用的輸出語(yǔ)言。
3)匯編階段:匯編器將hello.s翻譯成機(jī)器語(yǔ)言指令,將指令打包成一個(gè)可重定位目標(biāo)程序。
4)鏈接階段:printf函數(shù)存在于一個(gè)名為printf.o單獨(dú)編譯好的目標(biāo)文件中。鏈接器負(fù)責(zé)處理這種合并。
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiuxiu55/p/6767270.html
總結(jié)
- 上一篇: 【个人申明】主要发表平台迁至简书和公众号
- 下一篇: PCB阻抗控制