使用C++提供的預編譯頭文件支持,如果應用程序是很大的頭文件,使用預編譯頭文件可以大大降低應用程序的編譯時間。但預編譯頭文件是如何產生的,什么情況下需要預編譯頭文件,如何創建預編譯頭文件,預編譯頭文件在編譯器中編譯后會產生什么,使用預編譯頭文件需要注意什么,接下來針對於這些問題一一講解。
(1) 預編譯頭文件產生原因
編譯器在編譯程序時所做的事情主要分為預編譯,編譯,匯編,和鏈接。而針對於預編譯過程主要針對的是源文件中含有的“#”的指令,比如#include,#define進行展開,詳細的說就是:
- 把所有的“#define”刪除,並且展開所有的宏定義
- 處理所有的條件預編譯指令,比如 “#if”“#ifndef”“#else”“#endif”
- 處理“#include” 將被包含的文件遞歸插入到預編譯指令的位置,之所以遞歸是由於被包含的文件可能還包含其它文件
- 刪除所有的注釋,比如“//”“/**/”
這樣就會存在一個問題就是,如果頭文件相當的龐大,比如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) 注意事項
- 倘若工程較大,使用預編譯頭文件較好,加快編譯速度。工程比較小,不推薦使用。但是創建預編譯頭文件后,第一次編譯所花費的時間比后面的編譯要稍微長些。
- 倘若.pch文件不小心丟失,只需要讓編譯器重新編譯生成一個新的即可。
- 要確保放置在預編譯頭文件中的文件在工程開發時,不會被經常改變,否則的話,得不償失。
