假設我有一個*.cpp/.h/.hpp*
文件,其中#include <map>
在裏面,但我沒有使用任何定義或引用map
頭文件。我想讓VS給我一個警告或者我不使用包含文件的數據。Visual Studio 2012(其任何版本)是否顯示未使用的包含?
那麼Visual Studio 2012(在它的任何版本)顯示未使用的包括? (答案必須包括簡單 - 是/否)
假設我有一個*.cpp/.h/.hpp*
文件,其中#include <map>
在裏面,但我沒有使用任何定義或引用map
頭文件。我想讓VS給我一個警告或者我不使用包含文件的數據。Visual Studio 2012(其任何版本)是否顯示未使用的包含?
那麼Visual Studio 2012(在它的任何版本)顯示未使用的包括? (答案必須包括簡單 - 是/否)
沒有已知的方法來判斷您是否不使用包含文件中的任何內容。這是一個未解決的問題,除非是非常微不足道的情況。
考慮以下包含文件:
int x;
你怎麼能告訴我們,如果x
是或不是引用?包含該文件的編譯輸出可能會鏈接到訪問x
的另一個對象文件。編譯後的目標文件可能會以多種方式鏈接多次。
判斷包含文件是否不必要的最好方法是將其註釋掉或完全刪除,然後查看代碼是否仍然編譯。這是一個易於自動化的過程。
這些答案讓我走上了牆。其他語言都是這樣做的。任何支持C++的鏈接器都可以。這很容易:
編譯一切,生產,除其他事項外,一個符號表,模塊
鏈接。
undefined external
錯誤。extraneous external definition
警告。當你在它的時候,通過源文件對它們進行分組,並且只在該模塊中沒有符號被引用時纔會生成警告。要麼
對於靜態語言,你有一個符號表。 鏈接時,您可以看到該表中的哪些項目被使用。 你可以提供一個選項,至少突出所有不使用。
如果您確實需要構建這些東西,請執行上述步驟,然後在之後重建,以刪除可能未使用的引用。如果爆炸,請將其捲回。
有一百種方法可以解決這個問題。事實上,沒有一個IDE顯然這樣做是令人驚訝的。
至少,使其成爲一個「有幫助的提示」選項。編程人員的工作不是編譯器的工作。 IDE的職責是儘可能多地完成程序員的工作,相互理解最終責任在於椅子上的人。
來源我曾經寫C編譯器爲生。
你的意思是判斷一個包含文件是否有必要的最好方法*。這不能告訴你一個包含文件是不必要的。 (例如,如果include文件包含'int x;',那麼如果在該C++文件中沒有引用'x''',代碼仍然會被編譯,但如果它在另一個文件中被引用,它將不會鏈接。 include是必要的,即使代碼編譯沒有它。另一個例子是如果包含文件'#define'的東西,改變了後面的代碼的行爲,這是非常普遍的。) –
老問題,但@DavidSchwartz我認爲,在這情況下,可以肯定的是,通過「編譯」馬克意味着「構建」。六個之一... –
最佳實踐不是依靠間接包括嗎?如果想要使用'std :: vector',那麼即使該頭已經被前一個包含,並且該項目仍然會編譯,也應該包含''。所以 - 在我看來 - 只是看看代碼編譯是不是一個很好的解決方案。 –
MikeMB