次のような列挙型定義が与えられると、
enum Foo {
VALUE_A = 1;
VALUE_B = 5;
VALUE_C = 1234;
}
コンパイラは次のような関数を生成します:
- const EnumDescriptor* Foo_descriptor()
- この型のディスクリプタを返します。ディスクリプタは、この列挙型が定義する値についての情報を含みます。
- bool Foo_IsValid(int value)
- 与えられた値が Foo の定義値のいずれかに一致すれば true を返します。上の例では、入力が 1, 5, 1234 だったら true を返します。
注:
**** 注意
*整数を enum へキャストする時は注意してください*。
ある整数を enum 値へキャストするのなら、その値は列挙型の値のどれかでなければなりません。そうでない場合の結果は未定義です。
疑わしい場合は、生成された
Foo_IsValid()関数を用いてキャストが有効かどうか確認してください。
プロトコルメッセージの列挙型フィールドへ不正な値をセットすると、アサーション失敗を引き起こす場合があります。
メッセージの解析時に不正な列挙型の値が読まれた場合は、それは
未知のフィールドとして扱われます。
列挙型はメッセージ型の中に定義することができます。
この場合にプロトコルバッファコンパイラは、列挙型がそのメッセージのクラスの中にネストして宣言されたコードを生成します。
Foo_descriptor() と Foo_IsValid() 関数は静的メソッドとして宣言されます。
実際には、列挙型自身とその値はマングルされた名前でグローバルスコープに宣言され、typedef と一連の定数宣言でクラススコープへ取り込まれます。
これは宣言順序の問題に対処するためだけに行われています。
トップレベルのマングル名に依存してはなりません。本当に列挙型がメッセージクラスにネストされているかのように扱ってください。