2012-09-13 26 views

回答

3

沒有已知的方法來判斷您是否不使用包含文件中的任何內容。這是一個未解決的問題,除非是非常微不足道的情況。

考慮以下包含文件:

int x; 

你怎麼能告訴我們,如果x是或不是引用?包含該文件的編譯輸出可能會鏈接到訪問x的另一個對象文件。編譯後的目標文件可能會以多種方式鏈接多次。

1

判斷包含文件是否不必要的最好方法是將其註釋掉或完全刪除,然後查看代碼是否仍然編譯。這是一個易於自動化的過程。

+0

你的意思是判斷一個包含文件是否有必要的最好方法*。這不能告訴你一個包含文件是不必要的。 (例如,如果include文件包含'int x;',那麼如果在該C++文件中沒有引用'x''',代碼仍然會被編譯,但如果它在另一個文件中被引用,它將不會鏈接。 include是必要的,即使代碼編譯沒有它。另一個例子是如果包含文件'#define'的東西,改變了後面的代碼的行爲,這是非常普遍的。) –

+0

老問題,但@DavidSchwartz我認爲,在這情況下,可以肯定的是,通過「編譯」馬克意味着「構建」。六個之一... –

+0

最佳實踐不是依靠間接包括嗎?如果想要使用'std :: vector',那麼即使該頭已經被前一個包含,並且該項目仍然會編譯,也應該包含''。所以 - 在我看來 - 只是看看代碼編譯是不是一個很好的解決方案。 – MikeMB

4

這些答案讓我走上了牆。其他語言都是這樣做的。任何支持C++的鏈接器都可以。這很容易:

  1. 編譯一切,生產,除其他事項外,一個符號表,模塊

  2. 鏈接。

    • 任何使用但未定義的東西都已經生成undefined external錯誤。
    • 所有已定義但未使用的應該會生成一個extraneous external definition警告。當你在它的時候,通過源文件對它們進行分組,並且只在該模塊中沒有符號被引用時纔會生成警告。
  3. 要麼

    • 顯示警告: 「嘿,夥計,你沒有真正使用這個東西......所以......不管,人乾杯。」,或
    • 啓用一個上下文菜單選項,如「刪除未使用的包含」,以清理它。

對於靜態語言,你有一個符號表。 鏈接時,您可以看到該表中的哪些項目被使用。 你可以提供一個選項,至少突出所有不使用。

如果您確實需要構建這些東西,請執行上述步驟,然後在之後重建,以刪除可能未使用的引用。如果爆炸,請將其捲回。

有一百種方法可以解決這個問題。事實上,沒有一個IDE顯然這樣做是令人驚訝的。

至少,使其成爲一個「有幫助的提示」選項。編程人員的工作不是編譯器的工作。 IDE的職責是儘可能多地完成程序員的工作,相互理解最終責任在於椅子上的人。

來源我曾經寫C編譯器爲生。

相關問題