C++ 中stdafx.h是什麼意思

來源:互聯網
上載者:User
轉自:http://chunqingu.blog.163.com/blog/static/2275535720115743951140/

 

當使用visual c++時,總是包含了標頭檔stdafx.h,卻不知道是幹什麼用的。

呵呵,今天尋找了相關資料,解釋如下:

當 我們使用appwizard自動產生某些項目時,系統會自動把所需要include的標頭檔在stdafx.h中先include一下,這樣我們只需要直 接include這個stdafx.h檔案即可。因為同一個項目中的不同源檔案cpp都包含相同的include檔案,這樣為每個cpp檔案都重複 include這些檔案就顯得很傻了。

具體在stdafx.h中需要include什麼標頭檔,取決於使用者在appwizard中的選擇。

比如:

#include <afxwin.h>  //MFC core and standard components

#include <afxext.h> //MFC extensions

.......

這樣就方便多了,所以stdafx.h時自動產生的。這就使得使用者在開發中不必在每個cpp檔案中都繁瑣的include標頭檔了,而且維護起來也方便。

在 產生stdafx.h標頭檔的同時,也產生stdafx.cpp源檔案,該源檔案只包含#include "stdafx.h"語句,這是在編譯過程中第一個被編譯的檔案,編譯的結果儲存在一個名為stdafx.pch的檔案裡.(副檔名pch表示先行編譯頭文 件.)當visual c++編譯隨後的每個.cpp檔案時,它閱讀並使用它剛產生的pch檔案.visual c++不再分析windows include 檔案,除非使用者又編輯了stdafx.h或者stdafx.cpp。

看了這樣的講解,我馬上就實驗了一下,自己建立立的一個windows視窗項目,就產生了stdafx.h和stdafx.cpp。

並且,在主源檔案中,就cinlude此標頭檔stdafx.h。

以上情況,只在使用appwizard來自動產生項目的時候,才出現,否則,就沒有必要include此標頭檔stdafx.h了。

補充:

standard application frame extend

stdafx.h中沒有函數庫,只是定義了一些環境參數,使得編譯出來的程式能在32位的作業系統環境下運行。
  Windows和MFC的include檔案都非常大,即使有一個快速的處理常式,編譯器也要花費相當長的時間來完成工作。由於每個.CPP檔案都包含相同的include檔案,為每個.CPP檔案都重複處理這些檔案就顯得很傻了。
  為避免這種浪費,AppWizard和VisualC++編譯器一起進行工作,如下所示:
  ◎AppWizard建立了檔案stdafx.h,該檔案包含了所有當前工程檔案需要的MFCinclude檔案。且這一檔案可以隨被選擇的選項而變化。
  ◎AppWizard然後就建立stdafx.cpp。這個檔案通常都是一樣的。
  ◎然後AppWizard就建立起工程檔案,這樣第一個被編譯的檔案就是stdafx.cpp。
  ◎當VisualC++編譯stdafx.cpp檔案時,它將結果儲存在一個名為stdafx.pch的檔案裡。(副檔名pch表示先行編譯標頭檔。)
  ◎當VisualC++編譯隨後的每個.cpp檔案時,它閱讀並使用它剛產生的.pch檔案。VisualC++不再分析Windowsinclude檔案,除非你又編輯了stdafx.cpp或stdafx.h。
  這個技術很精巧,你不這麼認為嗎?(還要說一句,Microsoft並非是首先採用這種技術的公司,Borland才是。)在這個過程中你必須遵守以下規則:
  ◎你編寫的任何.cpp檔案都必須首先包含stdafx.h。
  ◎如果你有工程檔案裡的大多數.cpp檔案需要.h檔案,順便將它們加在stdafx.h(後部)上,然後先行編譯stdafx.cpp。
  ◎由於.pch檔案具有大量的符號資訊,它是你的工程檔案裡最大的檔案。
  如果你的磁碟空間有限,你就希望能將這個你從沒使用過的工程檔案中的.pch檔案刪除。執行程式時並不需要它們,且隨著工程檔案的重建立立,它們也自動地重建立立。

 

 

 如何使用VC的先行編譯技術

一、概念:

1、先行編譯:就是編譯器首先編譯某個檔案(稱為先行編譯標頭檔),然後將這個編譯結果儲存起來,之後如果有其他源檔案include了這個“先行編譯標頭檔”的時候,則自動從這個編譯結果提取需要的資訊進行編譯。

2、先行編譯結果檔案(Precompiled header file):就是那個用來儲存已經編譯了的符號資訊的檔案(.PCH作為尾碼)

3、產生先行編譯結果檔案(Create Precompiled header file):我們說源檔案A通過檔案B“產生先行編譯結果檔案”是指編譯A的時候將其中編譯B的編譯結果儲存成先行編譯結果檔案。一般使用嚮導的話,A檔案就 是“stdafx.cpp”,B檔案是“stdafx.h”。stdafx.cpp中就一行語句:

#include “stdafx.h”

4、使用先行編譯頭(Using precompiled header):我們說某個源檔案(a.cpp)通過“stdafx.h”來使用先行編譯結果是指編譯a.cpp的時候,如果a.cpp第一行 include語句是#include “stdafx.h”的話,那麼直接取先行編譯結果檔案的結果,不再重新編譯”stdafx.h”

二、嚮導是怎麼做的?

1、設定“stdafx.cpp”的先行編譯選項是通過“stdafx.h”檔案來“產生先行編譯結果檔案”。

2、其他源檔案的先行編譯選項設定是通過“stdafx.h”來“使用先行編譯頭”

三、使用原則?

1、將相對穩定的標頭檔(比如CRT,STL,第三方固定的庫)全部寫在stdafx.h中。(是否使用stdafx.h依賴個人喜好,不過使用stdafx.h可以和嚮導保持一致)

2、全部源檔案第一行都加#include “stdafx.h”。

3、一些不能修改的源檔案(如果公用的代碼,不具備許可權修改的代碼),設定他的先行編譯選項是“不使用先行編譯頭”。注意,一定不能是選擇“自動產生先行編譯頭”,因為這樣會將stdafx.h的結果衝掉(這個不知道是BUG還是設計的問題了,.^_^。)。

四、Q&A

Q、為什麼不全部使用“自動產生先行編譯標頭檔”?

A、“自動產生先行編譯標頭檔”和什麼都不用沒有什麼兩樣,編譯速度沒有質的提高。

Q、手工添加一個新的源檔案到項目的時候,經常出現類似錯誤:

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

A、因為嚮導預設的設定是“使用先行編譯頭”,但是你新加的檔案並沒有在第一行包含“stdafx.h”。解決的方法要麼修改成“不使用先行編譯頭”,要麼添加一行#include “stdafx.h”

Q、加stdafx.h和stdafx.cpp總覺得是和編譯平台綁定了,不具備移植性?

A、其實,注意一下stdafx.h的寫法就沒有問題了。我的解決方案是(stdafx.h的內容):

–begin of file stdafx.h

#ifdef _WIN32

#include “win.h”    // 泛指window下的公用標頭檔

#else

#include “linux.h”    // 泛指linux下的公用標頭檔

#endif

#include “crt.h”      //泛指c標準庫

#include “stl.h”      //泛指STL庫

–end of file

或者更加簡單一點,如果不是VC編譯器,那麼stdafx.h就什麼內容都不寫!

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.