作爲「不這樣做」的替代方案,請考慮以下內容 - 一組將觸發最多三個未使用的函數警告的函數。
static int get_version_number(void) { return 42; }
static double hidden_global_variable(void) { return 3.14; }
static int potential_alternative_to_macro(int x) { return 4 * x; }
寫另一個功能,可能是基於頭文件的名稱,
static void wno_unused_myheadername(void)
{
/* don't need to actually call the functions to avoid the warnings */
(void)&get_version_number;
(void)&hidden_global_variable;
(void)&potential_alternative_to_macro;
return;
}
我們現在下降到一個未使用的功能警告。如果在包含頭文件的文件中聲明的任何外部函數中添加對wno_unused_myheadername()的調用,則整個未使用的函數警告集將消失。因爲他們現在都被使用了。
編譯器將從任何地方去除任何未使用的函數,包括wno_unused_myheadername,因爲它可以看到所有的定義,並且可能確定對wno_unused函數的單個調用實際上並沒有執行任何操作。
我已經檢查了上述消除了在叮噹聲和gcc下的預期警告,您的milage可能會因其他編譯器而異。我沒有看過asm輸出來調查幾乎未使用的函數何時被剝離。
至於爲什麼 - 一個很好的理由會使用很多小函數,這些函數非常適合在C89中內聯,它沒有inline關鍵字,而且不需要編譯器的鏈接時間優化。
這對我來說不是問題。關於你的函數聲明或編譯的方式肯定有些奇怪。你能提供更多細節嗎? – crazyscot 2010-05-16 22:34:45
我想我們需要看到一些代碼,因爲這不會正常發生 - 請參閱標準頭文件示例 – Mark 2010-05-16 22:35:52
您正在使用哪種編譯器? – berkay 2010-05-16 22:39:19