2012-07-09 128 views
11

我今天第一次遇到了預編譯頭文件..改變了我的生活。我無法相信編譯我的C++代碼可能會很快。這使得現在總感覺..頭文件中的預編譯頭文件

無論如何,有一點是困惑我的是,從我至今讀,預編譯頭只應加入源文件(CPP?)。

在Visual Studio中,有項目屬性 - > C/C++下的選項 - >高級 「人力包含文件」。我將該編譯器選項設置爲stdafx.h

做this..I不再需要包括我已經加入到我的stdafx.h中頭之後,即使是在我的頭文件(源文件都應該自動包括stdafx.h中)。這是預期的行爲?

我無法找到一個地方,在頭/源文件之間的區別清楚。

如果does..great但恐怕它的那些東西VC++讓你得逞的,但將在GCC打破一個又一個。是的,它需要可移植;至少在GCC和VC++之間。

+1

那麼,如果你想讓你的項目在gcc上工作,那麼你最好遠離「強制包含文件」選項。 Boilerplate是使源代碼文件中的第一個#include包含預編譯頭文件。 – 2012-07-09 21:15:51

+2

@Hans,等效的gcc功能是使用'-include'命令行選項在每個文件的開頭包含* stdafx.h *。 – 2012-07-09 21:21:48

回答

13

的StdAfx.h真的應該只包含在源文件,而不是頭。我建議你在每個cpp中首先#include「StdAfx.h」,不要使用「強制包含文件」選項。多數民衆贊成我的跨平臺項目。爲了記錄,我實際上並沒有在GCC中使用預編譯頭文件,我只是通常構建它,並且它運行良好。

對於一些背景。編譯器僅查看源文件(即* .cpp,* .c等),因此編譯它們時必須包含每個頭文件並編譯頭文件中的任何代碼。預編譯頭文件選項允許一次性編譯所有代碼(即全局包含在StdAfx.h中的代碼),這樣您就不必一直這樣做。那就是StdAfx.cpp的用途。編譯器用StdAfx.h中包含的所有代碼編譯StdAfx.cpp,而不是每次構建時都要這樣做。

因此,由於您將StdAfx.h作爲第一項包含在每個源文件中,因此將它包含在任何頭文件中是沒有意義的,因爲它們將包含在StdAfx.h之後,因此將有權訪問StdAfx.h中的所有代碼。另外,你可以在其他項目中使用這些頭文件,而不必擔心有一個StdAfx.h或包含錯誤的頭文件。

+0

我的問題是VC++自動將這些添加到標題?使用我沒有包含的類型時(但是在stdafx.h中),我沒有遇到任何錯誤......非常奇怪。 – irwinb 2012-07-11 04:09:02

+2

不,強制include選項將文件添加到每個源/ cpp文件的第一行。工作方式包括將要包含的文件的內容放入源文件中#include的位置。使用force include選項可使每個CPP文件的頂部都包含StdAfx.h的內容,隨後是所有頭文件和源代碼的內容(無論文件中的順序如何)。所以效果是,StdAfx.h中定義的所有內容都將在您的頭文件中提供,在該項目中。編譯器只查看源文件而不是頭文件。 – syplex 2012-07-13 21:30:18

+0

哦,我明白了。這很有道理。謝謝你的解釋。 – irwinb 2012-07-19 18:19:13

4

是的,這是預期的行爲。項目屬性 - > C/C++ - >高級「人力包含文件」設置控制Visual C++ compiler option /FI

該選項的指定用雙 引號在文件中的#include指令在第一相同的效果每行 源文件

因此,它可以讓您免於包括stdafx.h手動。

儘管可以在GCC和其他編譯器中使用預編譯頭文件 Visual C++的快捷行爲在其他編譯器中不可移植。因此,請查看How to handle stdafx.h in cross-platform code?討論便攜式解決方案的想法。您可以在您的.cpp源文件中手動添加stdafx.h,並且您也可以使用GCC(假設您將爲GCC配置您的版本以使用預編譯頭文件)。

+0

廣告到.h和.cpp文件? – irwinb 2012-07-09 21:40:42

+0

@irwinb到.cpp文件。答案也已更新。 – mloskot 2012-07-09 22:18:32

+0

如果它只添加到.cpp文件,爲什麼VC++可以在我的頭文件中減少這些類型而不包含它們? – irwinb 2012-07-10 16:21:13

2

不要使用「強制包含文件」設置(/ FI),因爲它會中斷編輯&繼續! (和MS似乎並不想解決這個問題)

https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fi

https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h"只能作爲發現在源文件中的第一個非註釋行,不在頭文件中。