21

我瞭解預編譯頭文件的目的和推理。但是,實施它們時的規則是什麼?從我的理解,它是這樣的:如何在您的項目中實現預編譯頭文件

  1. 設置您的項目使用預編譯的標題與YU指令。
  2. 創建您的stdafx.h文件並將其設置爲您的預編譯頭。
  3. 包括此作爲您的每個.h文件中的頂部include語句。

這是正確的嗎?你是否應該將它包含在預編譯頭文件中的文件中?

錯誤C2857:目前,我與這個下面我的直覺時,遇到下列編譯錯誤與/Ycstdafx.h 命令行選項指定「的#include」聲明 在 源文件未找到

命令行選項是因爲這樣:

/OD/I 「../External/PlatformSDK/Include」/ I 「..」/ I」 ../ External/atlmfc/Include「 /D」_DEBUG「/ D」_UNICODE「/ D」UNICODE「 /Gm/EHsc/RTC1/MDd /Yc"stdafx.h」 /Fp"....\Output\LudoCore \ Debug \ LudoCore.pch「 /Fo」.... \ Output \ LudoCore \ Debug \「 /Fd"....\Output\LudoCore\Debug\vc80.pdb」 /W4/WX/nologo/C/ZI/TP/wd4201 /errorReport:提示

回答

34

您stdafx.cpp應包括stdafx.h中,並使用/Yc"stdafx.h"建造。

您的其他* .cpp應該包含stdafx.h並使用/Yu"stdafx.h"構建。

請注意編譯器選項中使用的雙引號字符!

下面是在Visual Studio設置的屏幕截圖stdafx.cpp創建一個預編譯的頭:

create precompiled header

這裏有相應的命令行選項(其是隻讀的,但反映了設置中指定在其他頁面上,請注意IDE插入雙引號字符的文件名,在編譯器選項):

options

這是在我的stdafx.cpp文件:

// stdafx.cpp : source file that includes just the standard includes 
// CallWinsock.pch will be the pre-compiled header 
// stdafx.obj will contain the pre-compiled type information 

#include "stdafx.h" 

// TODO: reference any additional headers you need in STDAFX.H 
// and not in this file 
+0

你是說這應該只在命令行中生成?在視覺工作室中,我不確定如何用蝙蝠的某個屬性創建某個東西。它似乎總是「添加 - >新項目 - >標題」等。 – Chris 2009-10-12 00:42:19

+0

右鍵單擊cpp文件並在上下文菜單上選擇「屬性」。在C++配置屬性頁面中,有一個用於「預編譯頭文件」,用於指定此CPP文件創建或使用預編譯頭文件。 – ChrisW 2009-10-12 00:50:00

+0

感謝您的更新。我已經完成了如上所示,仍然沒有骰子。以下是與上述有關的命令行選項:/ Od/I「../External/PlatformSDK/Include」/ I「..」/ I「../External/atlmfc/Include」/ D「_DEBUG」/ D「_UNICODE」/ D「UNICODE」/ Gm/EHsc/RTC1/MDd /Yc"stdafx.h「/Fp"..\..\Output\LudoCore\Debug\LudoCore.pch」/ Fo「.. \。 。\ Output \ LudoCore \ Debug \\「/Fd"..\..\Output\LudoCore\Debug\vc80.pdb」/ W4/WX/nologo/c/ZI/TP/wd4201/error報告:提示 – Chris 2009-10-12 01:49:26

5

您的#include "stdafx.h"應該是每個cpp文件的第一行。它不應該在.h文件中使用。除此之外,你是對的。

+0

我認爲他的問題是指定/Ycstdafx.h而不是/Yc"stdafx.h「。 – ChrisW 2009-10-11 23:47:14

5

「stdafx」只是一個約定。這絕不是強制性的。在一個多項目解決方案中,我使用了其他設置,併爲不同部分提供了多個預編譯頭文件。例如。將一個PCH與您的UI項目共享可能會很有用,另一個用於您的數據庫項目。

相關組件是列出預編譯頭文件的Xh文件,僅包含Xh(並且本身不添加代碼)的X.cpp文件,以及通過編譯X.cpp(從而Xh)創建的X.pch文件編譯選項/Yc

當你現在編譯y.cpp的文件,/Yu"X.pch",編譯器讀取並丟棄一切都交給#include "X.h"。此時,除了輸入流(保留爲Y.cpp,文件指針設置爲#include "X.h"之後的下一行)之外,它將用存儲在X.pch中的狀態替換其內部狀態。

+0

剛編輯修復了一個錯字。 – 2013-09-13 16:37:21

10

Visual Studio不僅可以通過項目存儲預編譯的頭文件屬性,還可以存儲源文件。

默認情況下,所有屬性都設置爲「從父項目或項目默認值繼承」,它只顯示該屬性的父對象值,但一旦在子級別覆蓋(在本例中爲.cpp文件),該文件忽略更改來自父母的財產。

你想要的配置是:

  1. 在項目層面與選擇「所有配置」(項目屬性,更改配置下降,由調試/釋放下),設置你的預編譯頭「使用」
  2. 選擇一個.cpp文件是包頭的源(據我所知並不重要的一個)
  3. 右鍵單擊並轉到屬性,然後選擇預編譯頭「創建」
  4. 最後確認沒有其他.cpp文件爲預編譯設置了值頭文件屬性(你可以通過粗體文本來判斷)
+0

修復了一個錯字:「每編譯」固定爲「預編譯」。 – 2013-09-13 16:38:40