2016-09-18 7 views
3

未使用の列挙型メンバーを見つける最速の方法は何ですか?Cで未使用の列挙型メンバーを見つける

私は約700人のメンバーを持っていて、使用されていない少数のメンバーを切り捨てたいので、1つずつコメントアウトすることはできません。

+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

もしあなたが本当に互換性を気にしたら、とにかく列挙タグに常に明示的に値を割り当てるべきです。 –

+0

もちろん、それはまだ比較的簡単に見落とすことのできるものです。 :-) –

1

すべての列挙型の名前を変更します(たとえば、名前の前に_を追加します)。コンパイル。以前の列挙型名(明らかに)が見つからないため、多くのエラーが発生します。 grep -fooのビットと、最初のエラーでコンパイラ/ビルドシステムが停止しないことを確認してください。使用しているすべてのenumのリストがあります!

少なくとも、私はそれをやる方法です。

関連する問題