跳到主要內容

終於搞懂了,預編譯頭文件(precompiled header)

預編譯頭文件

今天在改一個很大的程序,慢慢看,慢慢改。突然發現一個.c文件,裡面什麼也沒有,

就幾個頭文件,我一看,我靠,這不是把簡單的問題搞複雜了嗎,隨手刪掉那個c文件。

結果不能編譯了,我靠:

fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\':

No such file or directory

怎麼rebuild all都不行。

上網查了一下,才搞懂了:

----------------總結------

如果工程很大,頭文件很多,而有幾個頭文件又是經常要用的,那麼

1。把這些頭文件全部寫到一個頭文件裡面去,比如寫到preh.h

2。寫一個preh.c,裡面只一句話:#include "preh.h"

3。對於preh.c,在project setting裡面設置creat precompiled headers,對於其他

.c文件,設置use precompiled header file

//

哈哈

我試了一下,效果很明顯,不用precompiled header,編譯一次我可以去上個廁所,用

precompiled header,編譯的時候,我可以站起來伸個懶腰,活動活動就差不多啦

---------轉載的文章----------

預編譯頭的概念:

所謂的預編譯頭就是把一個工程中的那一部分代碼,預先編譯好放在一個文件裡(通常是

以.pch為擴展名的),這個文件就稱為預編譯頭文件這些預先編譯好的代碼可以是任何的

C/C++代碼--------甚至是inline的函數,但是必須是穩定的,在工程開發的過程中不會

被經常改變。如果這些代碼被修改,則需要重新編譯生成預編譯頭文件。注意生成預編

譯頭文件是很耗時間的。同時你得注意預編譯頭文件通常很大,通常有6-7M大。注意及

時清理那些沒有用的預編譯頭文件。

也許你會問:現在的編譯器都有Time stamp的功能,編譯器在編譯整個工程的時候,它

只會編譯那些經過修改的文件,而不會去編譯那些從上次編譯過,到現在沒有被修改過

的文件。那麼為什麼還要預編譯頭文件呢?答案在這裡,我們知道編譯器是以文件為單

位編譯的,一個文件經過修改後,會重新編譯整個文件,當然在這個文件裡包含的所有

頭文件中的東西(.eg Macro, Preprocesser )都要重新處理一遍。VC的預編譯頭文件

保存的正是這部分信息。以避免每次都要重新處理這些頭文件。

預編譯頭的作用:

根據上文介紹,預編譯頭文件的作用當然就是提高便宜速度了,有了它你沒有必要每次

都編譯那些不需要經常改變的代碼。編譯性能當然就提高了。

預編譯頭的使用:

要使用預編譯頭,我們必須指定一個頭文件,這個頭文件包含我們不會經常改變的

代碼和其他的頭文件,然後我們用這個頭文件來生成一個預編譯頭文件(.pch文件)

想必大家都知道 StdAfx.h這個文件。很多人都認為這是VC提供的一個「系統級別」的

,編譯器帶的一個頭文件。其實不是的,這個文件可以是任何名字的。我們來考察一個

典型的由AppWizard生成的MFC Dialog Based 程序的預編譯頭文件。(因為AppWizard

會為我們指定好如何使用預編譯頭文件,默認的是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」。原因是理所當然的,我們僅僅是要它能

夠編譯而已?D?D?D也就是說,要的只是它的.cpp的擴展名。我們可以用/Yc編譯開關來指

定StdAfx.cpp來生成一個.pch文件,通過/Fp編譯開關來指定生成的pch文件的名字。打

開project ->Setting->C/C++ 對話框。把Category指向Precompiled Header。在左邊的

樹形視圖裡選擇整個工程 

Project Options(右下角的那個白的地方)可以看到 /Fp 「debug/PCH.pch」,這就是指

定生成的.pch文件的名字,默認的通常是 <工程名>.pch(我的示例工程名就是PCH)。

然後,在左邊的樹形視圖裡選擇StdAfx.cpp.//這時只能選一個cpp文件!

這時原來的Project Option變成了 Source File Option(原來是工程,現在是一個文件

,當然變了)。在這裡我們可以看到 /Yc開關,/Yc的作用就是指定這個文件來創建一個

Pch文件。/Yc後面的文件名是那個包含了穩定代碼的頭文件,一個工程裡只能有一個文

件的可以有YC開關。VC就根據這個選項把 StdAfx.cpp編譯成一個Obj文件和一個PCH文件

。

然後我們再選擇一個其它的文件來看看,//其他cpp文件

在這裡,Precomplier 選擇了 Use ⋯⋯⋯一項,頭文件是我們指定創建PCH 文件的stda

fx.h

文件。事實上,這裡是使用工程裡的設置,(如圖1)/Yu」stdafx.h」。

這樣,我們就設置好了預編譯頭文件。也就是說,我們可以使用預編譯頭功能了。以

下是注意事項:

1):如果使用了/Yu,就是說使用了預編譯,我們在每個.cpp文件的最開頭,我強調一遍

是最開頭,包含 你指定產生pch文件的.h文件(默認是stdafx.h)不然就會有問題。如

果你沒有包含這個文件,就告訴你Unexpected file end. 如果你不是在最開頭包含的,

你自己試以下就知道了,絕對有很驚人的效果⋯..

fatal error C1010: unexpected end of file while looking for precompiled

header directive

Generating Code...

2)如果你把pch文件不小心丟了,編譯的時候就會產生很多的不正常的行為。根據以上

的分析,你只要讓編譯器生成一個pch文件。也就是說把 stdafx.cpp(即指定/Yc的那個

cpp文件)從新編譯一遍。當然你可以傻傻的 Rebuild All。簡單一點就是選擇那個cpp

文件,按一下Ctrl + F7就可以了。不然可是很浪費時間的哦。

//

呵呵,如果你居然耐著性子看到了這裡,那麼再回到帖子最開始看看我的總結吧!

留言

印度錐子寫道…
很清楚!

這個網誌中的熱門文章

當女友升級為妻子之後

某使用者詢問: 去年,我把 [女友1.0版] 升級成 [妻子1.0版] ,我注意到新的程式開始出現意料外的狀況,如小孩製造過程佔用了相當多的空間和資源,產品手冊當中並未提及這種現象。 此外,[妻子1.0版] 會把自己裝置到其他的應用程式當中,並且當其他系統起用的時候會自行啟動,監視其他系統所進行的所有活動。諸如 [撲克牌之夜1.3] 和 [猛灌啤酒2.5] 之類的應用軟體已經無法執行,所有相關系統都被摧毀。 我考慮回復到 [女友1.0版] ,但是 un-install 卻無效,你能夠幫我嗎? ------------------------------------------------------------ 技術支援部門的回答: xx先生您好,您的問題極為常見,且通常是因為您的基本誤解而產生的。 很多人把 [女友1.0版] 升級成為 [妻子1.0版] ,認為 [妻子1.0版] 純粹只是一種利用及娛樂性質的程式。其實 [妻子1.0版] 是一種運作系統,其創造者將其設計為一種能夠執行所有任務的軟體。這個軟體,你就再也無法從系統中un-install、delete或purge她。你不可能將 [妻子1.0版] 回復成 [女友1.0版] 的。 有些人曾企圖 install [女友2.0版] ,結果卻問題比原來的系統還多。請查看您手冊當中有關[警告-贍養費/撫養孩童] 的部分。我建議你還是留住 [妻子1.0版] ,處理目前所面臨的情況就好。 我本身也 install[妻子1.0版] ,我想順便建議你閱讀整個有關 [一般性保護失誤] (General Protection Faults, GPFs) 的部分。你可以預先假設所有可能發生的責任和失誤。發生當機時,最正確的動作就是按下 [道歉] 按鈕,然後再按下 [重新開機] 鈕。只要你能夠承擔所有 [一般性保護失誤] 的罪過,整個系統就可以正常運作。 [妻子1.0版] 是個很棒的程式,但是需要你經常去維護。 ------------------------------------------------------------ 軟體部門回答: 親愛的使用者,您好! 由於「妻子1.0版」無法un-install的問題,造成許多用戶的不便,本公司軟體部門同仁深表歉意! 但由於 「妻子1.0版」 的創始用意,乃在於提供一套能夠永久...

電子商務之十大勝算與十大敗筆

文章轉載自網路 Success and Failure of e-commerce E-commerce has evolved since the late 1990s. Companies and individuals have been using e-commerce to do business; furthermore, it allows people to do shopping online. Many have succeeded, and many have failed as well. Let us now look at the reasons for the success and failure. 10 reasons for successful e-commerce   EC 十大勝算 1)Target the Un-Targeted 找到競爭者沒看到的客戶需求。 Know your customers thoroughly Target needs that are unseen by your competitors. 2)Strong Business Planning  強而有力的業務計畫:掌握收入來源與策略細節。搞定想達到的目標。一步一步前進。 Know your source of revenue, break-even and the strategic details Decide on the future goals that you want to achieve 3)Business Friendly Ecommerce Software  有簡單好用的軟體。 Choose software that is easy to manage and allows you to focus on core business activities 4) Create a Web Store with a Difference  品牌的建立非常重要。創造有吸引力的區塊名,建立不一樣的網路商店。 Branding is important for the success of your online business Attractive domain name can play an important r...