由VC 中的stdafx h 引申出的問題

2021-06-06 16:39:17 字數 4074 閱讀 7644

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 ...