extension

extensionの範囲が与えられると、
message Foo {
  extensions 100 to 199;
}

プロトコルバッファコンパイラは、いくつかの Foo の追加メソッドを生成します: HasExtension(), ExtensionSize(), ClearExtension(), GetExtension(), SetExtension(), MutableExtension(), and AddExtension(). これらのメソッドは第一パラメータとして、extensionフィールドを識別する拡張識別子(下で説明します)をとります。 残りのパラメータと返り値は、拡張識別子と同じ型の通常(extensionでない)フィールドから生成した、対応するアクセサメソッドと全く同じになります。 (GetExtension() は特別なプリフィクスのないアクセサに対応します。)

次の extension定義を与えると:
extend Foo {
  optional int32 bar = 123;
}
プロトコルバッファコンパイラは、bar という「拡張識別子」を生成します。 これは以下のように、extension にアクセスするのに、Fooの extension アクセサと共に使うことができます。
Foo foo;
assert(!foo.HasExtension(bar));
foo.SetExtension(bar, 1);
assert(foo.HasExtension(bar));
assert(foo.GetExttension(bar) == 1);
foo.ClearExtension(bar);
assert(!foo.HasExtension(bar));

(拡張識別子の正確な実装は複雑で、魔法のようなテンプレートの使い方をしています。ですが、あなたは拡張識別子がそれをどのように使っているのかに悩む必要はありません。)

extension は別の型にネストして宣言することができます。 例えば、一般的なパターンは次のようになるでしょう:
message Baz {
  extend Foo {
    optional Baz foo_ext = 124;
  }
}
この場合は、拡張識別子の foo_extBaz の中にネストされて宣言されます。 これを次のように使うことができます。
Foo foo;
Baz* baz = foo.MutableExtension(Baz::foo_ext);
FillInMyBaz(baz);