簡體   English   中英

為什么Visual Studio C ++甚至在不需要的文件上也要求包含“ StdAfx.h”?

[英]Why does Visual Studio C++ require including “StdAfx.h” even on files that don't need it?

我知道使用“ #include” StdAfx.h“預編譯的標頭在做什么,是的,我知道我可以將它們關閉。但這不是我的問題。

如果您使用的是預編譯頭文件,則Visual C ++要求每個 cpp文件都必須#include“ StdAfx.h”,即使文件沒有使用StdAfx.h中的任何頭文件。 如果您忘記在一個文件中包含StdAfx.h,那就是錯誤。 但為什么? 顯而易見的方法是“如果包含StdAfx.h,則該文件將使用它,但是如果您忘記包含它,則將不包含那些頭文件。” 我不明白為什么VC ++在不需要時會要求您包含StdAfx.h。 似乎對於他們來說,將其像普通的頭文件一樣容易處理。

是否有充分的理由要求這樣做?

您的項目默認值為“使用預編譯頭”。 如果需要,可以將單個文件設置為“不使用預編譯頭”。

實際上, stdafx.cpp本身具有與項目默認設置不同的選項:

在此處輸入圖片說明

這種配置的意思是“開始編譯該文件(stdafx.cpp),在完成對包含stdafx.h的語句的編譯時停止”,並將預編譯的信息另存為.pch文件。首先使用此文件,以便可以使用。

項目默認值為:

在此處輸入圖片說明

這種配置的意思是“對於每個編譯文件,從指定的.pch中的預編譯數據開始,並包含stdafx.h點之后開始編譯新信息。” 這很重要,為什么要將stdafx.h作為文件的第一行包含在內。 如果稍后將其放在文件中,它仍然可以工作,但是#include之前的任何內容都將被忽略,因為該數據不會位於.pch中。 缺少#include意味着VS將掃描整個文件以查找預編譯的起始位置,但找不到它...生成錯誤。

如果您有不想使用預編譯信息的文件,則可以選擇該文件並將其覆蓋。 例:

在此處輸入圖片說明

Visual Studio不會使用預編譯的信息,也不會尋找要包含的標頭。

只是對馬克答案的補充。 實際上,您不必在所有項目源文件中手動包含stdafx.h 您可以使用項目選項“ Forced Include Files 在此處輸入圖片說明

這樣, stdafx.h將自動包含在您的所有源代碼中。

選擇文件后,右鍵單擊屬性,轉到“ C / C ++ \\ Precompiled標頭”部分,並將“ Precompiled標頭”設置為“不使用預編譯標頭”,請確保該配置(左上方)適用於當前選擇的版本。

它並不總是自動選擇“活動”配置。 因此您可以為非活動配置設置選項,這樣您將繼續遇到錯誤;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM