C/C++—— #include“stdafx.h”詳解__C++

來源:互聯網
上載者:User

轉自:http://blog.csdn.net/qingkong8832/article/details/6695123
1,用VS2008建立項目,選擇【Win32】-【Win32控制台應用程式】-輸入名稱:Test-【確定】

再選【下一步】-預設情況下,我們都是在【空項目】前打上對勾,建立一個純的C或C++程式。

我們這裡選擇預設,即【先行編譯頭】前打上對勾,之後【完成】

2,在Test項目中,標頭檔有stdafx.h和targetver.h,源檔案有stdafx.cpp和Test.cpp,還有一個ReadMe.txt檔案。

3,預設的主函數為

#include "stdafx.h"  int _tmain(int argc, _TCHAR* argv[])  {      return 0;  }  

和我們一般的寫的程式不一樣,我們一般會寫成下面的形式:

#include  <stdio.h>  int main()  {         return 0;  } 

4,我們要糾結,這裡怎麼沒有了stdio.h了呢,取而代之的是stdafx.h呢。
我們開啟stdafx.h檔案,如下:

// stdafx.h : 標準系統包含檔案的包含檔案,  // 或是經常使用但不常更改的  // 特定於項目的包含檔案  //  #pragma once  #include "targetver.h"  #include <stdio.h>  #include <tchar.h>  // TODO: 在此處引用程式需要的其他標頭檔 

可以看到,這裡包含了stdio.h庫檔案,為什麼包含到這裡呢。我們先不急著解答。
先看看,stdafx.cpp檔案:

// stdafx.cpp : 只包括標準包含檔案的源檔案  // Test.pch 將作為先行編譯頭  // stdafx.obj 將包含先行編譯類型資訊  #include "stdafx.h"  // TODO: 在 STDAFX.H 中  // 引用任何所需的附加標頭檔,而不是在此檔案中引用

這裡面只有包含的庫檔案,沒有操作,它是做什麼用的呢。
在ReadMe.txt中,我們看到這麼一段話:

其他標準檔案:
StdAfx.h, StdAfx.cpp
這些檔案用於產生名為 Test.pch 的先行編譯頭 (PCH) 檔案和名為 StdAfx.obj 的先行編譯類型檔案。

原來是產生先行編譯標頭檔。

5,百科上參看下:

一、什麼是先行編譯頭?     所謂先行編譯頭,就是把標頭檔事先編譯成一種二進位的中間格式,供後續的編譯過程使用。先行編譯頭物理上與通常的的.obj檔案是一樣的,但是千萬不要把這個中間格式與. o/.obj/.a/.lib的格式混淆,他們是截然不同的。所以先行編譯標頭檔的特性和目標檔案也不同(儘管他們都屬於某種中間檔案)。編譯入先行編譯頭的.h,.c,.cpp檔案在整個編譯過程中,只編譯一次,如先行編譯頭所涉及的部分不發生改變的話,在隨後的編譯過程中此部分不重新進行編譯。進而大大提高編譯速度,並便於對標頭檔進行管理,也有助於杜絕重複包含問題。——但也有類似的地方的,比如,它們都是編譯器之間不相容的^_^,就是說你不能把VC產生的先行編譯頭拿到GCC上去用。甚至副檔名都不一樣,VC的是大家都熟悉的. pch,而GCC的,是.gch。   二、什麼時候使用先行編譯頭?     當大多.c或.cpp檔案都需要相同的標頭檔時。     當某些代碼被大量重複使用時。     當匯入某些不同庫都有實現的函數,併產生混亂時。  

6,可以知道先行編譯,是為了提高編譯速度。
再看下面一段話

stdafx.h    1名稱的英文全稱為:Standard Application Fram Extend    所謂標頭檔先行編譯,就是把一個工程(Project)中使用的一些MFC標準標頭檔(如Windows.H、Afxwin.H)預先編譯,以後該工程編譯時間,不再編譯這部分標頭檔,僅僅使用先行編譯的結果。這樣可以加快編譯速度,節省時間。     先行編譯標頭檔通過編譯stdafx.cpp產生,以工程名命名,由於先行編譯的標頭檔的尾碼是“pch”,所以編譯結果檔案是projectname.pch。     編譯器通過一個標頭檔stdafx.h來使用先行編譯標頭檔。stdafx.h這個標頭檔名是可以在project的編譯設定裡指定的。編譯器認為,所有在指令#include "stdafx.h"前的代碼都是先行編譯的,它跳過#include "stdafx. h"指令,使用projectname.pch編譯這條指令之後的所有代碼。     因此,所有的MFC實現檔案第一條語句都是:#include "stdafx.h"。  2 詳細工作原理及作用    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檔案刪除。執行程式時並不需要它們,且隨著工程檔案的重建立立,它們也自動地重建立立。  

要點:
(1). Windows和MFC的include檔案都非常大,即使有一個快速的處理常式,編譯器也要花費相當長的時間來完成工作。由於每個.CPP檔案都包含相同的include檔案,為每個.CPP檔案都重複處理這些檔案就顯得很傻了。
(2).MFC中,你編寫的任何.cpp檔案都必須首先包含stdafx.h。

(3).由於.pch檔案具有大量的符號資訊,它是你的工程檔案裡最大的檔案,不需要的時候可以刪除。

7,我們可以自己設定自己的先行編譯檔案,不一定非要是stdafx.h

右擊stdafx.cpp檔案,選擇【屬性】-【C/C++】-【先行編譯頭】-【建立/使用先行編譯頭】

可以看到有3個選項:【建立先行編譯頭】、【使用先行編譯頭】和【不使用先行編譯頭】。

stdafx.cpp肯定選擇的是【建立先行編譯頭】

============================================================================

再右擊Test.cpp檔案,選擇【屬性】-【C/C++】-【先行編譯頭】-【建立/使用先行編譯頭】

可見,它選擇的是【使用先行編譯頭】,下面選的檔案是StdAfx.h檔案,最下面指明的是pch檔案的路徑

================================================================================

如何建立自己的先行編譯檔案,其實過程正如上面我們講的過程。
如果工程很大,標頭檔很多,而有幾個標頭檔又是經常要用的,那麼

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

2,寫一個preh.c,裡面只一句話:#include “preh.h” ,為了生存pch先行編譯檔案

3,對於preh.c,在【屬性】裡面設定【建立先行編譯頭】,對於其他.c檔案,設定【使用先行編譯頭】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.