C++ 預編譯頭文件


使用C++提供的預編譯頭文件支持,如果應用程序是很大的頭文件,使用預編譯頭文件可以大大降低應用程序的編譯時間。但預編譯頭文件是如何產生的,什么情況下需要預編譯頭文件,如何創建預編譯頭文件,預編譯頭文件在編譯器中編譯后會產生什么,使用預編譯頭文件需要注意什么,接下來針對於這些問題一一講解。

(1)       預編譯頭文件產生原因

編譯器在編譯程序時所做的事情主要分為預編譯,編譯,匯編,和鏈接。而針對於預編譯過程主要針對的是源文件中含有的“#”的指令,比如#include,#define進行展開,詳細的說就是:

  1. 把所有的“#define”刪除,並且展開所有的宏定義
  2. 處理所有的條件預編譯指令,比如 “#if”“#ifndef”“#else”“#endif”
  3. 處理“#include” 將被包含的文件遞歸插入到預編譯指令的位置,之所以遞歸是由於被包含的文件可能還包含其它文件
  4. 刪除所有的注釋,比如“//”“/**/”

這樣就會存在一個問題就是,如果頭文件相當的龐大,比如window.h甚至MFC庫中所包含的各種頭文件,如果將如此龐大的一個工程文件進行一一展開的話,編譯的速度可想而知。

然而,時代的進步,人們發現,在某個工程中,總會有那些一些頭文件幾乎是所有的cpp所必須包含的,這樣將這些頭文件提取出來,然后編譯,可以提高編譯的速度。所以預編譯就這樣產生了。

(2)       創建預編譯頭文件

最為簡單的例子,以vs2008為例,打開項目,File -> New -> Project,建立一個win32 console application ,直接下一步,成功后,編譯其會默認產生一個stdafx.h和Stdafx.cpp。產生.cpp文件的原因僅僅是讓它可以編譯而已,頭文件是不可以被編譯的。所以stdafx.cpp中一般僅包含一個其頭文件,

如果編譯成功的話,在相對應的目錄下會生成一個stdafx.pch的預編譯頭文件(.pch)。如果說,在編譯程序的過程出現這樣的問題:

fatal error C1083: Cannot open precompiled header file: 'Debug×××.pch': No such file or directory

表示.pch文件未創建成功,可右擊工程打開屬性修改:

C/C++ -> 預編譯頭->創建/使用預編譯頭:創建預編譯頭(/Yc) 即可。

如果文件過小,我不想使用預編譯頭文件,或者出現這樣的問題:

error C2857: 在源文件中沒有找到用/Ycstdafx.h 命令行選項指定的#include語句

可將其該.cpp文件屬性修改為“不使用預編譯頭”即可,或將其stdafx.h添加到相應的.cpp文件中即可。

(3)       注意事項

  1. 倘若工程較大,使用預編譯頭文件較好,加快編譯速度。工程比較小,不推薦使用。但是創建預編譯頭文件后,第一次編譯所花費的時間比后面的編譯要稍微長些。
  2. 倘若.pch文件不小心丟失,只需要讓編譯器重新編譯生成一個新的即可。
  3. 要確保放置在預編譯頭文件中的文件在工程開發時,不會被經常改變,否則的話,得不償失。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM