4

當編譯器編譯源文件(例如*.cpp)文件時,它會創建目標文件(例如*.o),以便稍後它將鏈接到其他文件的.o.so.lib)文件並構成可執行文件。Visual Studio強制在項目的所有編譯單元中包含預編譯頭文件?

現在對於不編譯頭類比情況每次產生了一些.pch files,使其由接頭連接它,然後時間的文件。

現在如果在Visula Studio項目的範圍內定義了預編譯頭,那麼爲什麼Visual Studio會報錯(例如**fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?**),說明頭文件未包含在.cpp文件中。

通過總結,這裏是我的問題:

  1. 爲什麼在每個.cpp文件中項目的預編譯的頭是必要的 ?
  2. 如何編譯頭的存在的在每個編譯單元的要求優化編譯過程?換句話說,這個要求有什麼好處? (這可能是由用戶來決定,其中包括,在不!)
  3. 如果預編譯的頭被納入一個.cpp文件,它使用只有2%是什麼.PCH文件,那麼剩下的98%會被添加到相應的.o文件中去?
+1

有預編譯頭沒有標準的編譯模型。每個編譯器都定義了自己的規則和語義。 –

回答

9

在每個爲何.cpp文件該項目的預編譯的頭是必要的嗎?

因爲你自找的。如果你不想使用它,那麼你需要改變.cpp文件的選項。右鍵單擊它,Properties,C/C++,預編譯頭文件,「Create/Use」=「不使用預編譯頭文件」。默認設置是「使用」。這樣做沒有意義。

每個編譯單元中的預編譯頭文件如何優化編譯過程?

通過不必分析#includes。當你#include <windows.h>特別有用。在數百個包含數百個.cpp文件的大型項目中,時間節省了大約幾分鐘。這是迄今爲止最便宜的方法,可以在生成的代碼沒有質量損失的情況下加快編譯器的速度。

那麼剩下的98%會被加到相應的.o文件中去?

當然。

3
  1. 實際上並沒有必要在每個編譯單元中包含預編譯頭。您可以在該文件的C/C++ - > Precompiled Headers屬性部分爲單個文件設置「不使用預編譯頭文件」設置。雖然這是很多工作,並且我從來不知道任何人在生產代碼中這樣做。
  2. 優化是預編譯頭只建立一次,整個shebang被重新用於所有編譯單元而不用重新編譯/重新包括(有點)。如果您有一組包含很多次的文件,這可以節省大量編譯時間。請參閱The Care And Feeding of Precompiled Headers
  3. 不,你沒有得到多餘的文件內容,就像你別當靜態鏈接。
+2

「這是一個大量的工作,雖然,我從來不知道任何人都可以做到這一點在生產代碼。」 - 我們在生產代碼中使用它,因爲靜態庫與我們的Linux產品共享。在Visual Studio中,您可以多選所有CPP文件並以這種方式設置屬性。 – camelCase

1
  1. 我想你的問題意味着「爲什麼編譯器不能假定這個頭文件總是存在,如果它是強制性的」。原因是VS不想偏離標準這麼多。如果你的.cpp文件使用頭文件中的某些東西,它必須包含它。這樣,即使您關閉預編譯頭文件,您的文件也會完全一樣(只需要更長的時間)。
  2. 正如其他人所說,你可以明確,如果你想禁用單個文件預編譯頭。這個想法是,你應該只在預編譯頭文件中包含你在大多數(如果不是全部)文件中使用的那些元素。
  3. 否,所得到的目標代碼應該是相同的,無論頭被預編譯或沒有。