2009-03-29 18 views
11

gccでコンパイルするC99typedef enum

私はしばらくの間列挙型を使用していました。しかし、私はアプリケーションを開発するためにいくつかのサンプルコードを使用しています。そして、私はこのようなコードを見つけました。私はこれがenumを使うときのベストプラクティスの使用であると知らされています。しかし、私はこれにどのような利点があるかは分かりません。 TYPE_COUNTを持っていると、なぜTYPE_UNKNOWNTYPE_COUNTを割り当てるのはなぜ

typedef enum { 
    TYPE_DATE, 
    TYPE_TIME, 
    TYPE_MONEY, 

    TYPE_COUNT, 
    TYPE_UNKNOWN = TYPE_COUNT 
} string_type_e; 

ご意見ありがとうございます。

答えて

17

デフォルトでは、列挙型はコンパイラによって自動的に0から始まる整数値が与えられます。したがって、日付はゼロ、時間は1、お金は2になります。次の値は、 'psuedo'列挙値TYPE_COUNTに与えられます。値3は、適切な列挙値の数になります。

TYPE_UNKNOWNは、「適切な」値ではない値を表す別の値であるため、テストは失敗しますe < TYPE_COUNTTYPE_COUNTと等しいことは、それぞれの意味のある値が連続していることを意味しますが、私はそれに大きな利点がないことを認識しています(TYPE_COUNTが2の累乗よりも1つ小さいと、コンパイラがどのような表現、および連続した値を持つことができますが、とにかくTYPE_COUNT過ぎてそれらをインクリメントしないだろうと、それは本当に

+0

列挙型の名前付き定数に0x2や0xfffeのような値を割り当てることができますか? – Namratha

+1

@Namratha可能ですが、値が別のコンポーネントとのインターフェースの一部として固定されているプロトコルの場合は、かなり一般的です。そのような場合、値が連続していなければそれらの上に数えないので、おそらく最後に 'TYPE_COUNT'のようなものを使用しないでしょう。 –

6

数値は基本的に整数定数です。デフォルトでは、enum + 1の最後の要素の値(最初の要素の場合は0)が与えられます。配列や何かとマッピングするのに便利な要素を数えたい場合、そのような宣言された列挙型(何かを追加または削除すると動的に更新される)のCOUNT定数をそれの終わり(あなたの例ではTYPE_COUNT)。列挙で無効な値を区別できるようにするには、別の定数を宣言したいと思うかもしれません。あなたの例では、その定数はカウント定数に等しくなります。これはあなたのenumの最大値より大きな値です。

3

なぜtype_countがあり、type_countをtype_unknownに割り当てるのはなぜですか?

enumの最大許容値にタブを維持するには指定された値が正しい(範囲内である)かどうかをチェックする方法はありません。

+0

しかし、列挙型の範囲内にギャップやオーバーラップが存在する可能性があります。例ではありませんが、一般的には列挙型です。 –

+0

@Jonathan:著者が基礎となるシーケンスにギャップを持つ列挙型を設計していた場合、カウント定数を定義するこの方法は役に立たないでしょう。だから、後者を望む著者は前者を避けるだろう。 – Shog9

2

TYPE_COUNTは、列挙型の要素をインデックスとする配列ディメンション化する働きをすることができる)、重要ではありません。その「素敵な」:

type_info my_info[TYPE_COUNT]; 

forループの終了条件で使用できます。 TYPE_UNKNOWNを使用すると、型の値が不正または未定義であることを表すことができます(値はTYPE_COUNTの代わりに-1を使用できます)。