2016-08-01 31 views
0

我正在去除使用在頭文件中聲明的變量的一堆C代碼。無論出於何種原因,我的編譯器都不會警告頭文件中未使用的變量。有什麼選項可以從頭文件中調用未使用的變量。它從C文件中完成。如何從頭文件中獲取未使用的變量警告?

+1

你沒有得到這些,因爲其他C文件可能包含標題並使用變量。如果你想得到那些,你必須暫時將它們移動到C文件中。 – merlin2011

+4

在頭文件中定義變量通常被認爲是不好的做法 - 您可以*聲明*它,但不應該*定義*它。如果只有*聲明*並且未被使用,那麼編譯器通常沒有警告(它不會做任何事情,但是不花錢)。你確定你真的*定義了*變量嗎?你能舉一些例子嗎? – tofro

+0

除非編譯器能夠看到包含'foo.h'的源文件_all_,否則它不知道是否使用了'foo.h'聲明的對象。聽起來像是鏈接器的工作。 – chux

回答

2

首先,編譯器因此甚至不知道變量是在頭文件還是在.c文件中聲明的 - 預處理器運行後,這是無法區分的。

你通常在頭文件中聲明的是外部引用,即存儲類external的變量。沒有編譯器我知道警告如果這樣一個變量是未使用的 - 很多系統頭文件聲明這樣的變量,並且如果它會被充斥着警告(errnostderr是值得注意的示例 - 您不希望被警告任何不使用的源文件errnostderr

編譯器可以針對未使用的static變量和未使用的函數參數發出警告。這些變量的用法和範圍僅限於當前的編譯單元或函數,「其他人可能會使用它們」,因此警告是有意義的。 extern變量可以很好地被其他目標文件使用,因爲那些編譯器將不能發出警告 - 但是一個合適的鏈接器會意識到外部符號不會被任何目標文件使用,並從該目標文件中悄悄地移除該變量最終可執行文件 - 無需警告,因爲它可以通過編譯系統修復。

0

對於C編譯器,頭文件(包含)和任何其他C源文件之間沒有區別。

編譯器不必發出有關未使用的全局數據的警告消息,因爲此數據可能被其他軟件使用。

如果您擔心僅在單個對象文件的作用域中使用一段數據,請嘗試在static關鍵字前加上此數據定義,重新生成並運行您的軟件。如果過了一段時間,一切仍然正常,你肯定知道任何可能的(懶惰)動態鏈接仍然會很樂意釋放你剛剛刪除的全局數據 - 它是真正100%安全的刪除它。

+0

你最後的提議可能不是一個好主意:如果15個源文件中包含了具有相同'static'定義的相同頭文件('static'is * always *定義),那麼你將有15個相同變量的實例跨越你的代碼 - 而如果你把它放在原來的位置(沒有'靜態'),鏈接器會抱怨多個定義。您的建議只有在.c文件中才有意義。 – tofro

+0

第二個想法是,您會收到未使用的'static'的警告 - 因此它可能確實有助於檢測不使用該變量的位置。 – tofro

+0

@tofro是的,你完全正確。給我+1 :) – sqrt163

相關問題