2011-09-02 13 views

回答

10

原始問題的答案是#pragma hdrstop在既不設置/ Yc也不設置/ Yu設置的文件的目的是它被忽略,因此您可以設置一個構建配置,該構建不需要預編譯頭文件和其他構建使用預編譯頭文件的配置,並且不需要更改代碼或所有包含的頭文件來執行此操作。

更多細節...

MSDN上的說明指出:「hdrstop編譯指示可以讓您更好地控制預編譯文件名稱和編譯狀態保存的位置。」這是真的,但它不是特別明顯究竟有多大用處......

簡而言之,

  • 將#pragma hdrstop放在未使用/ Yc或/ Yu編譯的源文件中根本沒有任何效果。
  • 如果你爲文件設置了/ Yu,那麼hdrstop會告訴編譯器在hdrstop出現的行之前丟棄所有內容,並插入預編譯頭。
  • 如果爲文件設置了/ Yc,那麼hdrstop意味着保存所有編譯狀態,直到hdrstop作爲預編譯頭文件顯示的行。

訣竅是使用/ Yc和/ Yu沒有可選的頭文件名;只需勾選'使用'或'創建'單選按鈕,並將'直通標題'編輯框留空(或編輯項目文件...)。

因此,您有1個文件,可能稱爲PrecompiledHeader.cpp,其中包含要包含在預編譯頭中的頭文件,並且在包含文件列表的末尾包含#pragma hdrstop。這個文件是用/ Yc編譯的。

然後,在包含預編譯頭文件中的文件之後,您將所有其他cpp文件與#pragma hdrstop一起使用。這些文件都是用/ Yu編譯的。

這會導致PrecompiledHeader.cpp使用該單個pch文件構建您的(本例中)單個pch文件和所有其他文件。

這樣做的好處是你的文件中不需要包含'全局'預編譯頭部構建頭文件 - 所以沒有stdafx.h或其他任何東西。這意味着您可以設置一個構建配置,該配置可在沒有預編譯頭的情況下構建,其中所有#pragma hdrstop行都會被忽略。

這是「好」,因爲這意味着你可以有一個單獨的「無預編譯」構建配置,它可以讓你快速開發(你可以改變一個頭,而不是迫使世界重建)和其他「正常」配置那使用預編譯頭文件。

+0

謝謝。非常感謝你! ...現在,嗯...... *「然後你的所有其他cpp文件都帶有#pragma hdrstop,位於預編譯頭文件中的包含文件之後。」*這是否意味着其他文件需要知道預編譯頭文件,以便他們可以在hdrstop行之前和之後分割它們的包含? –

+2

如果你這樣做會更好。但你不必這樣做。如果您的文件位於#pragma hdrstop之上,並且不在您的預編譯頭文件中,那麼您將在預編譯版本中發生構建錯誤。然後,您可以決定它是否被廣泛使用以保證在precomp中不存在。 –

5

所有的代碼之前#pragma hdrstop將是預編譯的頭的一部分。如果沒有文件名指定參數,標題的名稱將是具有.PCH擴展名的源文件的基名,例如the documentation提到:

預編譯的頭文件的名稱根據被確定 以下規則,按優先級順序:

  1. 到/ Fp的編譯選項

  2. filename參數的參數的#pragma hdrstop會

  3. 具有.PCH擴展名的源文件的基本名稱

所以,如果你有一個名爲blah.cpp文件時,它會產生一個名爲blah.pch文件,IFF與/Yc編譯(只一個文件應該已經設置)。

+0

這是當你繞過選項0,1和2時發生的那種事情。使用/ Yu非常普遍,選項爲0. –

4

如果在您的C/C++項目中沒有使用#pragma hdrstop,您會想到一個專用的.cpp文件作爲.pch創建的源文件。

如果在要用來創建.pch文件的.cpp文件中使用#pragma hdrstop,那麼.cpp文件可以在#pragma hdrstop行後面有其他有用的內容。當您首先使用/ Yc編譯選項編譯此.cpp文件時,您將獲得.pch文件和.obj文件。當您更改.cpp文件並使用/ Yu編譯選項重新編譯它時,編譯器用.pch文件替換#pragma hdrstop行的內容,並重新編譯#pragma hdrstop行後面的部分,創建一個新的.obj文件,保存編譯時間。您的項目只有一個源文件是非常有用的。

對於僅使用預編譯頭文件的源文件,#pragma hdrstop是編譯器的一個里程碑,哪個部分應該被.pch文件替換,因此您不需要使用/ Yu編譯選項指示頭文件名。

+0

謝謝。這個答案使*有些感覺。所以你必須使用不同的編譯器開關編譯* same * cpp文件,這樣纔有意義? –

+0

是的。一個C/C++項目可以使用多個.pch文件。您可以通過/ Yu編譯選項或#pragma hdrstop爲每個源文件指定.pch。 – ligand

+0

我知道的很多。我想問的是:爲了讓這個有意義,我們有一個總是用'/ Yu'編譯的'U.cpp'和另外一個總是用'/ Yc'編譯的'C.cpp'? *或*我們有一個'UC.cpp',它是用'/ Yc'然後用'/ Yu'編譯一次? –

相關問題