預編譯文件,預編譯頭文件認識

 1、概念:
一、預編譯:就是編譯器首先編譯某個文件(稱爲預編譯頭文件),而後將這個編譯結果保存起來,以後若是有其餘源文件include了這個「預編譯頭文件」的時候,則自動從這個編譯結果提取須要的信息進行編譯。
二、預編譯結果文件(Precompiled header file):就是那個用來保存已經編譯了的符號信息的文件(.PCH做爲後綴)
三、生成預編譯結果文件(Create Precompiled header file):咱們說源文件A經過文件B「生成預編譯結果文件」是指編譯A的時候將其中編譯B的編譯結果保存成預編譯結果文件。通常使用嚮導的話,A文件就是「stdafx.cpp」,B文件是「stdafx.h」。stdafx.cpp中就一行語句:
#include 「stdafx.h」
四、使用預編譯頭(Using precompiled header):咱們說某個源文件(a.cpp)經過「stdafx.h」來使用預編譯結果是指編譯a.cpp的時候,若是a.cpp第一行include語句是#include 「stdafx.h」的話,那麼直接取預編譯結果文件的結果,再也不從新編譯」stdafx.h」
2、嚮導是怎麼作的?
一、設置「stdafx.cpp」的預編譯選項是經過「stdafx.h」文件來「生成預編譯結果文件」。
二、其餘源文件的預編譯選項設置是經過「stdafx.h」來「使用預編譯頭」

3、使用原則?
一、將相對穩定的頭文件(好比CRT,STL,第三方固定的庫)所有寫在stdafx.h中。(是否使用stdafx.h依賴我的喜愛,不過使用stdafx.h能夠和嚮導保持一致)
二、所有源文件第一行都加#include 「stdafx.h」。
三、一些不能修改的源文件(若是公共的代碼,不具有權限修改的代碼),設置他的預編譯選項是「不使用預編譯頭」。注意,必定不能是選擇「自動生成預編譯頭」,由於這樣會將stdafx.h的結果沖掉(這個不知道是BUG仍是設計的問題了,.^_^。)。
4、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就什麼內容都不寫!linux

相關文章
相關標籤/搜索