列挙型

次のような列挙型定義が与えられると、
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 と一連の定数宣言でクラススコープへ取り込まれます。 これは宣言順序の問題に対処するためだけに行われています。 トップレベルのマングル名に依存してはなりません。本当に列挙型がメッセージクラスにネストされているかのように扱ってください。