VC 6中的預編譯頭

2021-04-13 00:18:38 字數 4705 閱讀 2110

vc++6中的預編譯頭

預編譯頭的概念:

在很多程式中,每個原始檔都存在一些相同的部分。比如要包括相同的一些標頭檔案,而且這些標頭檔案可能很長,例如

window.h

。如果用普通的方法編譯這些原始檔,對這些標頭檔案在每個原始檔中的出現都要重新編譯,作了很多重複工作。如果能將這些標頭檔案專門進行編譯,並且把結果儲存起來。然後在編譯包含這些標頭檔案的原始檔時,使用上述結果替代標頭檔案在原始檔中的出現,就可以大大減少工作量。

microsoft visual c++

提供的「預編譯標頭檔案」機制就支援這一功能。

所謂的預編譯頭就是把乙個工程中的那一部分**

,預先編譯好放在乙個檔案裡

(通常是以

.pch

為副檔名的

),這個檔案就稱為預編譯標頭檔案。這些預先編譯好的**可以是任何的

c/c++

**--------

甚至是inline

的函式,但是必須是穩定的,在工程開發的過程中不會被經常改變。如果這些**被修改,則需要重新編譯生成預編譯標頭檔案。注意生成預編譯標頭檔案是很耗時間的。同時你得注意預編譯標頭檔案通常很大,通常有

6-7m

大。注意及時清理那些沒有用的預編譯標頭檔案。

也許你會問:現在的編譯器都有

time stamp

的功能,編譯器在編譯整個工程的時候,它只會編譯那些經過修改的檔案,而不會去編譯那些從上次編譯過,到現在沒有被修改過的檔案。那麼為什麼還要預編譯標頭檔案呢?答案在這裡,我們知道編譯器是以檔案為單位編譯的,乙個檔案經過修改後,會重新編譯整個檔案,當然在這個檔案裡包含的所有標頭檔案中的東西(

.eg macro, preprocesser

)都要重新處理一遍。

vc的預編譯標頭檔案儲存的正是這部分資訊。以避免每次都要重新處理這些標頭檔案。

預編譯頭的使用:

方法一:手動方法

要使用預編譯頭,我們必須指定乙個標頭檔案,這個標頭檔案包含我們不會經常改變的**和其他的標頭檔案,然後我們用這個標頭檔案來生成乙個預編譯標頭檔案(

.pch

檔案)想必大家都知道

stdafx.h

這個檔案。很多人都認為這是

vc提供的乙個

「系統級別

」的,編譯器帶的乙個標頭檔案。其實不是的,這個檔案可以是任何名字的。我們來考察乙個典型的由

生成的mfc dialog based

程式的預編譯標頭檔案。(因為

會為我們指定好如何使用預編譯標頭檔案,預設的是

stdafx.h

,這是vc

起的名字)。我們會發現這個標頭檔案裡包含了以下的標頭檔案:

#include // mfc core and standard components

#include // mfc extensions

#include // mfc automation classes

#include // mfc support for internet explorer 4 common controls

#include

這些正是使用

mfc的必須包含的標頭檔案,當然我們不太可能在我們的工程中修改這些標頭檔案的,所以說他們是穩定的。

那麼我們如何指定它來生成預編譯標頭檔案。我們知道乙個標頭檔案是不能編譯的。所以我們還需要乙個

cpp檔案來生成

.pch

檔案。這個檔案預設的就是

stdafx.cpp

。在這個檔案裡只有一句**就是:

#include 「stdafx.h」

。原因是理所當然的,我們僅僅是要它能夠編譯而已

―――也就是說,要的只是它的

.cpp

的副檔名。我們可以用

/yc編譯開關來指定

stdafx.cpp

來生成乙個

.pch

檔案,通過

/fp編譯開關來指定生成的

pch檔案的名字。開啟

project ->setting->c/c++

對話方塊。把

category

指向precompiled header。在

project options(

右下角的那個白的地方

)可以看到

/fp 「debug/pch.pch」

,這就是指定生成的

.pch

檔案的名字,預設的通常是 

<

工程名》.pch

(我的示例工程名就是

pch)。

這時原來的

project option

變成了source file option

(原來是工程,現在是乙個檔案,當然變了)。在這裡我們可以看到

/yc開關,

/yc的作用就是指定這個檔案來建立乙個

pch檔案。

/yc後面的檔名是那個包含了穩定**的標頭檔案,乙個工程裡只能有乙個檔案的可以有

yc開關。

vc就根據這個選項把

stdafx.cpp

編譯成乙個

obj檔案和乙個

pch檔案。

在這裡,

precomplier

選擇了use ………

一項,標頭檔案是我們指定建立

pch

檔案的stdafx.h

檔案。事實上,這裡是使用工程裡的設定,

/yu」stdafx.h」

。這樣,我們就設定好了預編譯標頭檔案。也就是說,我們可以使用預編譯頭功能了。以下是注意事項:

1):如果使用了

/yu,就是說使用了預編譯,我們在每個

.cpp

檔案的最開頭,我強調一遍是最開頭,包含

你指定產生

pch檔案的

.h檔案(預設是

stdafx.h

)不然就會有問題。如果你沒有包含這個檔案,就告訴你

unexpected file end.

如果你不是在最開頭包含的,你自己試以下就知道了,絕對有很驚人的效果

…..2

)如果你把

pch檔案不小心丟了,根據以上的分析,你只要讓編譯器生成乙個

pch檔案就可以了。也就是說把

stdafx.cpp

(即指定

/yc的那個

cpp檔案)從新編譯一遍就可以了。當然你可以傻傻的

rebuild all

。簡單一點就是選擇那個

cpp檔案,按一下

ctrl + f7

就可以了。

方法二:自動使用

很簡單只要指定

/yx就可以了。或者在上圖中選擇

automatic………

就可以了。注意的事情是如果你指定了

/yc /yu

的話,/yx

是會被忽略的。前者的優先級別高一些.

下面從另乙個角度再看一下:

假設每個原始檔的相同部分都出現在檔案的開始部分。這一假設是很現實的。那麼相同部分的結尾如何定位呢?由兩種方法,一是由程式設計師在原始檔中用

#pragma hdrstop

標記;二是指定對某個標頭檔案的包含指示符(

#include directive

)作為結束標誌。這個標頭檔案被稱為

through header file

,在/yc

或者/yu

命令引數中指明。

在編譯第乙個原始檔時,將從檔案頭到預編譯部分結束處的編譯結果儲存到乙個預編譯標頭檔案中,副檔名通常是

pch。這個過程稱為預編譯標頭檔案的生成。這一步工作需要指定

/yc引數。在對其他原始檔進行編譯時,使用這個預編譯標頭檔案,此時用

/yu引數。生成的預編譯標頭檔案的名字通過

/fp引數指定。

下面舉乙個例子。假設

project

中共用的巨集定義,常量定義,標頭檔案引用都放在

prechdr.h

中。我編輯乙個

prechdr.cpp

來#include 「prechdr.h」

。對prechdr.cpp

編譯時就可以生成包含

prechdr.h

中內容的預編譯標頭檔案:

cl /ycprechdr.h /fp./debug/prechdr.pch prechdr.cpp

這樣,就建立了

prechdr.pch

。在編譯其他原始檔時,使用

prechdr.pch

:cl /yuprechdr.h /fp./debug/prechdr.pch others.cpp

在ide

中,可以將

project settings

設定成/yuprechdr.h /fp./debug/prechdr.pch

。然後將

prechdr.cpp

的c++ tab

中precompile

類別設定成

use precompiled header

,即在使用

project settings

的基礎上增加了

/yc引數。當

/yc和

/yu共存時,只有

/yc起作用。

ide在

build project

時會最先編譯

prechdr.cpp

以建立預編譯標頭檔案供其他原始檔使用。

VC 預編譯頭

預編譯頭的概念 在很多程式中,每個原始檔都存在一些相同的部分。比如要包括相同的一些標頭檔案,而且這些標頭檔案可能很長,例如window.h。如果用普通的方法編譯這些原始檔,對這些標頭檔案在每個原始檔中的出現都要重新編譯,作了很多重複工作。如果能將這些標頭檔案專門進行編譯,並且把結果儲存起來。然後在編...

VC6 編譯選項問題

為了能將原始檔編譯成dll目標 以前總以為是要設定 mt,md mt d,md d.那麼在link命令列中有 1 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.li...

解析VC 6中的指標

解析vc 6中的指標 摘要 指標,在vc 中是很常見的,這裡我們並不打算去詳細講解在c 中那樣的指標用法 我們會有另外的文章去詳細討論 這裡主要講一下vc 中常見的對指標獲取的方法,包括 工具條 狀態條 控制項和視窗的指標。獲取工具條的指標 在預設狀態下,有乙個預設的工具條afx idw 我們可以根...