關於預編譯頭 (轉)
一、什麼是預編譯頭?
預編譯頭物理上與通常的的.obj是一樣的,但編譯入預編譯頭的.h,.c,.cpp檔案在整個編譯過程中,只編譯一次,如預編譯頭所涉及的部分不發生改變的話,在隨後的編譯過程中此部分不重新進行編譯。進而大大提高編譯速度,並便於對標頭檔案進行管理,也有助於杜絕重複包含問題。
二、什麼時候使用預編譯頭?
當大多.c或.cpp檔案都需要相同的標頭檔案時。
當某些程式碼被大量重複使用時。
當匯入某些不同庫都有實現的,併產生混亂時。
三、預編譯頭所涉及的編譯開關及使用方法(for msvc)
1、自動預編譯:由決定什麼時候建立和使用預編譯頭。
編譯引數:-YX。使用此引數預設時建立以VCxy.pch命名的預編譯標頭檔案。其中x,y是vc的版本號。可以用-Fp指定pch檔案的輸出路徑和檔名。
比如:cl –c –YX –Fp“precomp.pch” **將在當前目錄下生成precomp.pch的預編譯標頭檔案。**代表原始檔。
2、手動預編譯:
編譯引數:
-Yc”預編譯的標頭檔案的名字” 此時預設建立與標頭檔案同名的預編譯標頭檔案。如要該為其他名字,可使用-Fp選項。
比如:cl –c –Yc”precomp.h” ** 將建立precomp.pch的預編譯標頭檔案。
:namespace prefix = o ns = "urn:schemas--com::office" />
-Yu” 預編譯的標頭檔案的名字” 表示在某個原始檔時使用此預編譯頭,而不在進行重新編譯。比如:
cl –c –Yu”precomp.h” **
注:相應預編譯頭必須在前面已建立過。
四、在makefile中簡單的使用預編譯技術
obji386de.obj: debug.c debug.h
$(CC) –Yc”precomp.h” -Fo$@ debug.c
obji386OperateReg.obj: OperateReg.c OperateReg.h
$(CC) –Yu”precomp.h” -Fo$@ OperateReg.c
obji386WaterMark.obj: WaterMark.c WaterMark.h
$(CC) –Yu”precomp.h” -Fo$@ WaterMark.c
以下同。
其中precomp.h為想預編譯的標頭檔案。
五、關於預編譯頭的一些複雜的使用方法
如:
cl -c -Yc"stuff.h" -Fplevel1.pch level1.cpp -------------(1)
cl -c -Yu"stuff.h" -Fplevel1.pch -Yc level2.cpp --------------(2)
level2.cpp的開始是這樣的,其中 #pragma hdrstop 表示預編譯結束,所以說程式碼也可以放入預編譯頭。
#include "stuff.h"
#include "morestuff.h"
#pragma hdrstop("level2.pch")
(1) 建立使用stuff.h 重新命名為level1.pch的預編譯頭。
(2) 在從stuff.h建立的預編譯頭level1.pch的基礎上,參考level2.cpp建立另一個預編譯頭level2.pch
此時的命名規則參見Yc無引數時的使用方法。
預編譯頭的其他使用細則請參考msdn。
附:
1、 預編譯與guard宏
這是兩個根本沒有關係的概念,如果說非要找出相同的地方,那就是預編譯頭對控制重複包含也有一定的幫助。
#ifndef _PLOTBRUSH_
#define _PLOTBRUSH_
---
#endif // _PLOTBRUSH_
這種guard宏是防止在同一個.c檔案中把同一個.h檔案包含兩次。
即防止出現
#include <.h>
#include 的情況的。 而預編譯頭相當於在全域性的角度,來控制那些部分僅被編譯一次的問題。 而guard宏只對當前編譯單元有效。在1.c中定義了_PLOTBRUSH_對2.c是根本沒影響的。 2、 98ddk中build 時,使用build –Z將只編譯有改變的原始檔。-c 起清除目標資料夾的作用。 如有錯漏請指正。 Written by 李智勇 /3/21
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-957515/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於Delphi中預編譯指令的使用方法 (轉)編譯
- 關於VC的編譯模式 (轉)編譯模式
- 關於JSP預編譯的中文問題JS編譯
- C++ 預編譯標頭檔案C++編譯
- 關於 VC 編譯的猜想與試驗 (轉)編譯
- 關於庫的編譯編譯
- 透過預編譯標頭檔案的方法來提高c++builder的編譯速度(英文原版) (轉)編譯C++UI
- 0909關於編譯原理編譯原理
- 關於TIJ的編譯問題編譯
- 關於Android APK反編譯AndroidAPK編譯
- 關於C++&Java中命令列編譯的問題 (轉)C++Java命令列編譯
- #ifndef預編譯編譯
- 關於Gdb工具的交叉編譯、移植編譯
- 關於程式的編譯和連結編譯
- [翻譯]關於Swift的編譯時間優化Swift編譯優化
- 真正理解預編譯標頭檔案: Procompiled header編譯CompileHeader
- 關於Delphi7的IntraWeb 編譯的Apache (DSO) 模組 (轉)Web編譯Apache
- [轉]andriod的apk檔案相關的編譯反編譯工具APK編譯
- js預編譯 --預編譯詳解四部曲JS編譯
- Java 相關的編譯技術(轉)Java編譯
- CSS預編譯器CSS編譯
- 關於支援OPenACC的編譯器說明編譯
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- 對預編譯的理解編譯
- stylus(css預編譯器)CSS編譯
- JDBC預編譯語句JDBC編譯
- cmake使用教程(九)-關於安卓的交叉編譯安卓編譯
- 反編譯使用yield關鍵字的方法 轉編譯
- 編譯器相關編譯
- 關於Electron原生模組編譯的一點總結編譯
- 關於64位Linux編譯hadoop2Linux編譯Hadoop
- 0909 關於編譯原理學習的想法編譯原理
- [翻譯]關於通用文件轉換器Pandoc
- 關於JS的編碼轉換問題JS
- [20170406]關於檔案頭轉儲.txt
- 關於Basic程式直譯器及編譯原理的簡單化(2)---C++封裝好的Basic直譯器 (轉)C程式編譯原理C++封裝
- 關於jive(J道版),安裝正常,編譯出錯!編譯
- sqlserver2005預編譯SQLServer編譯