stdafx.h是乙個特別的標頭檔案,這個標頭檔案裡面的內容包括了大多數.cpp檔案所引用的標準的和不輕易改變的標頭檔案的定義。可以說,stdafx.h 是乙個很多標頭檔案的集合。舉個例子來說,如果使用者要寫乙個win32 api的程式,而且這個程式包括了10個.cpp檔案,由於這10個.cpp檔案都包括了windows.h, string, vector等等檔案,所以使用者便可以把這些重複定義的標頭檔案都放在
stdafx.h
中。當使用者在編譯的時候,vc++編譯器會首先編譯在
stdafx.cpp 的內容(一般這個
stdafx.cpp裡面只包括 #include "stdafx.h"
這一句話),並且把這些都儲存在乙個precompiled header file(即.pch檔案)
裡面以供其它9個.cpp 檔案來使用。其優點是顯而易見的,即省去了每個 .cpp 引用的標頭檔案的編譯,而只是編譯一次,這個尤其對於大型的專案很重要。比如,我有乙個中型的專案,大概有100個左右的 .cpp 檔案。 如果程式設計師取消了這個 precompiled 的功能,那麼第一次編譯就要花半個小時左右的時間來編譯;但是如果採用了這個
precompiled 的功能,那麼也就花費幾分鐘左右的時間。很多人不喜歡引用
precompiled 的功能,認為
precompiled headers 把所有在 .cpp
檔案中定義的標頭檔案都引用了,不論有用沒有都包括進來了,但是對於大型專案,這還是很重要的,而且是高效的。
據我所知,vc++是惟乙個支援precompiled header 功能的ide。
如果使用者想取消這個功能,則
project->settings->c\c++->category:precompiled headers dialog-> not use precompiled headers.
接下來說說具體如何操作,新建乙個 win32 dynamic-link library 的project, 命名為testdll, 然後選擇 a dll that exports some symbols 。這樣就按照ms預設的定義自動生成並新增了 testdll.cpp , testdll.h , stdafx.cpp, stdafx.h 四個檔案。
首先分別compile這四個檔案,先compile testdll來試一下,結果發現出錯:
--------------------configuration: testdll - win32 debug--------------------
compiling...
testdll.cpp
d:\my_project\c++\dllpractise04\testdll\testdll.cpp(4) : fatal error c1083: cannot open precompiled header file: 'debug/testdll.pch': no such file or directory
error executing cl.exe.
testdll.obj - 1 error(s), 0 warning(s)
原因在於第乙個編譯testdll.cpp的時候,由於系統預設的選擇了
precompiled headers 的功能,所以就假定系統已經生成了 .pch 檔案,即
precompiled headers file。 但是由於我們這個程式是第一次編譯,在資料夾中根本就沒有這個檔案,所以自然compiler是找不到這個檔案的。我們只能做的是先編譯 stdafx.cpp ,或者 build all.
deleting intermediate files and output files for project 'testdll - win32 debug'.
--------------------configuration: testdll - win32 debug--------------------
compiling...
stdafx.cpp 看,系統首先complie的是stdafx.cpp哦。注意這個順序
compiling...
testdll.cpp 其次才是我們自己定義的cpp.
linking...
creating library debug/testdll.lib and object debug/testdll.exp
testdll.dll - 0 error(s), 0 warning(s)
好了,這個project便成功了。可是我們還是不能停步,接著研究一下。
在testdll.cpp中,把前兩行的 #include "stdafx.h" #include "testdll.h" 換乙個位置變成,
#include "testdll.h"
#include "stdafx.h"。 重新編譯testdll.dll 或者 build all,都發生了如下的錯誤:
deleting intermediate files and output files for project 'testdll - win32 debug'.
--------------------configuration: testdll - win32 debug--------------------
compiling...
stdafx.cpp
compiling...
testdll.cpp
d:\my_project\c++\dllpractise04\testdll\testdll.cpp(26) : error c2144: syntax error : missing ';' before type 'int'
d:\my_project\c++\dllpractise04\testdll\testdll.cpp(26) : error c2501: 'testdll_api' : missing storage-class or type specifiers
d:\my_project\c++\dllpractise04\testdll\testdll.cpp(26) : fatal error c1004: unexpected end of file found
error executing cl.exe.
testdll.dll - 3 error(s), 0 warning(s)
發現這麼多的錯誤,但是唯獨肯定的是stdafx.cpp編譯通過了,問題就出在我們剛才調換了的順序。
系統預設下,在宣告包含stdafx.h的語句之前的語句都將被完全忽略。
所以在 compile 的時候就把第一句話
#include "testdll.h"
忽略了, 而在
testdll.h
中定義了關於
testdll_api
的意義.
解決的辦法要麼把順序調換回來,或者在project->settings->c\c++->category:precompiled headers dialog-> not use precompiled headers.
重新編譯就可以通過了.
VC中的標頭檔案stdafx h的作用
stdafx.h 標準系統包含檔案的包含檔案。microsoft c 和 c 編譯器提供了用於預編譯任何 c 或 c 包括內聯 的選項。利用此效能特性,可以編譯穩定的 體,將已編譯狀態的 儲存在檔案中,以及在隨後的編譯中,將預編譯的 與仍在開發的 結合起來。由於不需要重新編譯穩定 因此後面每次編譯的...
C 中stdafx h的意思
當使用visual c 時,總是包含了標頭檔案stdafx.h,卻不知道是幹什麼用的。比如 include mfc core and standard components include mfc extensions 這樣就方便多了,所以stdafx.h時自動生成的。這就使得使用者在開發中不必在每...
C 中stdafx h的作用體會
stdafx.h的作用體會 當使用visual c 時,總是包含了標頭檔案stdafx.h,卻不知道是幹什麼用的.哈哈,今天查詢了相關資料,解釋如下 比如 include mfc core and standard components include mfc extensions include ...