跳到主要內容

終於搞懂了,預編譯頭文件(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就可以了。不然可是很浪費時間的哦。

//

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

留言

印度錐子寫道…
很清楚!

這個網誌中的熱門文章

ASP.Net MVC2 AuthorizeAttribute 的自訂用法

許多 Web 應用程式都需要使用者登入,再授權讓使用者存取受限制的內容。在某些應用程式中,對於登入使用者也可能會限制可檢視的內容或可編輯的欄位。 若要限制對 ASP.NET MVC 檢視的存取,您可以限制存取呈現檢視的動作方法。為了達成此目的, MVC 架構提供了 AuthorizeAttribute 類別。 基本上, MSDN 只有這篇 AuthorizeAttribute 類別 http://msdn.microsoft.com/zh-tw/library/system.web.mvc.authorizeattribute.aspx 還有這篇:「 ASP.NET MVC 應用程式中的動作篩選」有提到 http://msdn.microsoft.com/zh-tw/library/dd410209.aspx MSDN 範例如下,雖然使用方式很簡單,但是初學者應該會有很多疑惑;例如: 1. 掛上 [Authorize] 屬性,就可以限制使用者了嗎? 2. [ Authorize (Users = "Betty, Johnny" )] 可以用來限制特定使用,那使用者身分如何取得? 3. [ Authorize (Roles = "Admin, Super User" )] 可以用來限制角色存取,那如何給定使用者的角色身分? 4. 為何只要給字串 (Users = "Betty, Johnny" )(Roles = "Admin, Super User" ) 就有效了? 如果上述問題,對你來說,都可以回答,那基本上,你已經是很嫻熟 ASP.Net MVC AuthorizeAttribute 的機制。 public class HomeController : Controller { public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } publi

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

文章轉載自網路 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