2016-09-18 69 views
3

查找未使用的枚舉成員的最快方法是什麼?查找未使用的枚舉成員C

逐個評論數值將無法正常工作,因爲我有將近700名成員,並希望修剪掉一些未使用的數據。

+0

編寫一個程序,以您想要的方式創建'enum'定義源,並將其作爲Makefile中的預編譯步驟運行?保存所有構建的日誌並解析它們以獲取相關的編譯錯誤? – alk

+0

您可以編寫一個屏蔽枚舉的腳本,然後重新構建項目,然後在報告編譯錯誤時解除枚舉,然後繼續下一個枚舉。 –

+0

@SouravGhosh:編譯器通常不會告訴您代碼中的冗餘聲明/定義(除了未使用的局部變量)。 –

回答

5

我不知道有任何編譯器警告,但您可以嘗試使用splint靜態分析器工具。據其documentation(重點煤礦):

夾板檢測常量,函數,參數,變量,類型, 枚舉成員,並聲明 ,但從未使用結構或聯合的字段。

當我檢查時,它的工作原理如圖所示。下面是示例代碼:

#include <stdio.h> 

enum Month { JAN, FEB, MAR }; 

int main() 
{ 
    enum Month m1 = JAN; 
    printf("%d\n", m1); 
} 

通過運行splint命令,你會獲得以下信息:

main.c:3:19: Enum member FEB not used 
    A member of an enum type is never used. (Use -enummemuse to inhibit warning) 
main.c:3:24: Enum member MAR not used 
1

注意»未使用«這裏是一個比較危險的術語。

typedef enum type_t { VALUE_A, VALUE_B, VALUE_C } type_t; 

int main() { 
    printf("A = %d, ", VALUE_A); 
    printf("C = %d", VALUE_C); 
    return 0; 
} 

將打印A = 0, C = 2,但除去»未使用«VALUE_B輸出變爲A = 0, C = 1

如果你堅持這些值,對它進行算術運算或者在那個區域進行任何操作,你最終可能會改變程序的行爲。

+0

如果您真的關心兼容性,那麼始終應該明確地爲枚舉標籤指定值。 – 2016-09-18 21:05:54

+0

當然,但它仍然是可以被忽略的東西,相對容易。 :-) –

1

更改所有枚舉的名稱(例如,通過在其名稱前添加_)。編譯。你會得到很多錯誤,因爲它不會找到以前的枚舉名(顯然)。有一點grep -foo並確保編譯器/編譯系統不會停止第一個錯誤 - 並且您將擁有所有正在使用的枚舉的列表!

至少,我就是這麼做的。