C 生成代码指南 | 协议缓冲区文档 – ProtoBuf 中文
namespace
如果 .proto
文件包含 package
声明,则该文件的所有内容都将放置在相应的 C 命名空间中。例如,给定 package
声明
package foo.bar;
该文件中的所有声明都将驻留在 foo::bar
命名空间中。
message
给定一个简单的消息声明
代码语言:javascript复制message Foo {}
协议缓冲区编译器生成一个名为 Foo
的类,该类公开派生自 google::protobuf::Message
。
Message
接口定义了允许您检查、操作、读取或写入整个消息的方法,包括从二进制字符串进行解析和序列化到二进制字符串。
bool ParseFromString(const string& data)
:从给定的序列化二进制字符串(也称为线格式)解析消息。bool SerializeToString(string* output) const
:将给定消息序列化为二进制字符串。string DebugString()
:返回一个字符串,提供该协议的text_format
表示形式(仅应用于调试)。
除了这些方法之外,Foo
类还定义了以下方法
Foo()
:默认构造函数。~Foo()
:默认析构函数。Foo(const Foo& other)
:复制构造函数。Foo(Foo&& other)
:移动构造函数。Foo& operator=(const Foo& other)
:赋值运算符。Foo& operator=(Foo&& other)
:移动赋值运算符。void Swap(Foo* other)
:与另一条消息交换内容。const UnknownFieldSet& unknown_fields() const
:返回解析此消息时遇到的未知字段集。如果在.proto
文件中指定了option optimize_for = LITE_RUNTIME
,则返回类型将变为std::string&
。UnknownFieldSet* mutable_unknown_fields()
:返回一个指向解析此消息时遇到的可变未知字段集的指针。如果在.proto
文件中指定了option optimize_for = LITE_RUNTIME
,则返回类型将变为std::string*
。
该类还定义了以下静态方法
static const Descriptor* descriptor()
:返回类型的描述符。其中包含有关该类型的信息,包括它有哪些字段以及它们的类型是什么。这可以与 反射 一起使用,以通过编程方式检查字段。static const Foo& default_instance()
:返回Foo
的一个常量单例实例,它与Foo
的新构造实例相同(因此所有奇数字段都未设置,所有重复字段都为空)。请注意,可以通过调用消息的New()
方法将消息的默认实例用作工厂。 field int 对于这两个字段定义
optional int32 foo = 1;
required int32 foo = 1;
编译器将生成以下访问器方法
bool has_foo() const
:如果设置了该字段,则返回true
。int32 foo() const
:返回字段的当前值。如果未设置该字段,则返回默认值。void set_foo(int32 value)
:设置字段的值。调用此方法后,has_foo()
将返回true
,foo()
将返回value
。void clear_foo()
:清除字段的值。调用此方法后,has_foo()
将返回false
,foo()
将返回默认值。
repeat
对于此字段定义
代码语言:javascript复制repeated int32 foo = 1;
编译器将生成以下访问器方法
int foo_size() const
:返回字段中当前的元素数量。要检查空集,请考虑使用底层RepeatedField
中的empty()
方法,而不是此方法。int32 foo(int index) const
:返回给定基于零的索引处的元素。使用 [0, foo_size()) 范围外的索引调用此方法会导致未定义的行为。void set_foo(int index, int32 value)
:设置给定基于零的索引处的元素的值。void add_foo(int32 value)
:使用给定值将新元素追加到字段的末尾。void clear_foo()
:从字段中删除所有元素。调用此方法后,foo_size()
将返回零。const RepeatedField<int32>& foo() const
:返回存储字段元素的底层RepeatedField
。此容器类提供类似 STL 的迭代器和其他方法。RepeatedField<int32>* mutable_foo()
:返回指向存储字段元素的底层可变RepeatedField
的指针。此容器类提供类似 STL 的迭代器和其他方法。
对于其他数字字段类型(包括 bool
),int32
根据 标量值类型表 替换为相应的 C 类型。
string or bytes
对于这些字段定义
代码语言:javascript复制optional string foo = 1;
required string foo = 1;
optional bytes foo = 1;
required bytes foo = 1;
编译器将生成以下访问器方法
bool has_foo() const
:如果设置了该字段,则返回true
。const string& foo() const
:返回字段的当前值。如果字段未设置,则返回默认值。void set_foo(const string& value)
:设置字段的值。调用此项后,has_foo()
将返回true
,而foo()
将返回value
的副本。void set_foo(string&& value)
(C 11 及更高版本):设置字段的值,从传递的字符串中移动。调用此项后,has_foo()
将返回true
,而foo()
将返回value
的副本。void set_foo(const char* value)
:使用 C 风格的以空字符结尾的字符串设置字段的值。调用此项后,has_foo()
将返回true
,而foo()
将返回value
的副本。void set_foo(const char* value, int size)
:与上述类似,但字符串大小是明确给出的,而不是通过查找空终止符字节来确定。string* mutable_foo()
:返回指向存储字段值的string
可变对象的指针。如果在调用之前未设置字段,则返回的字符串将为空(不是默认值)。调用此项后,has_foo()
将返回true
,而foo()
将返回写入给定字符串的任何值。void clear_foo()
:清除字段的值。调用此方法后,has_foo()
将返回false
,foo()
将返回默认值。void set_allocated_foo(string* value)
:将string
对象设置为字段,并在存在的情况下释放之前的字段值。如果string
指针不是NULL
,则消息将获取已分配的string
对象的所有权,并且has_foo()
将返回true
。消息可以随时删除已分配的string
对象,因此对该对象的引用可能会失效。否则,如果value
为NULL
,则行为与调用clear_foo()
相同。string* release_foo()
:释放字段的所有权并返回string
对象的指针。调用此项后,调用方将获取已分配的string
对象的所有权,has_foo()
将返回false
,而foo()
将返回默认值。
repeat
对于这两个字段定义
代码语言:javascript复制repeated string foo = 1;
repeated bytes foo = 1;
编译器将生成以下访问器方法
int foo_size() const
:返回字段中当前的元素数量。要检查空集,请考虑使用底层RepeatedField
中的empty()
方法,而不是此方法。const string& foo(int index) const
:返回给定基于零的索引处的元素。使用 [0, foo_size()-1] 范围外的索引调用此方法会导致未定义的行为。void set_foo(int index, const string& value)
:设置给定基于零的索引处的元素的值。void set_foo(int index, const char* value)
:使用 C 风格的空终止字符串设置给定基于零的索引处的元素的值。void set_foo(int index, const char* value, int size)
:同上,但字符串大小是明确给出的,而不是通过查找空终止字节来确定。string* mutable_foo(int index)
:返回指向可变string
对象的指针,该对象存储给定基于零的索引处的元素的值。使用 [0, foo_size()) 范围外的索引调用此方法会导致未定义的行为。void add_foo(const string& value)
:使用给定值将新元素追加到字段的末尾。void add_foo(const char* value)
:使用 C 风格的空终止字符串将新元素追加到字段的末尾。void add_foo(const char* value, int size)
:同上,但字符串大小是明确给出的,而不是通过查找空终止字节来确定。string* add_foo()
:在字段末尾添加一个新的空字符串元素并返回指向它的指针。void clear_foo()
:从字段中删除所有元素。调用此方法后,foo_size()
将返回零。const RepeatedPtrField<string>& foo() const
:返回存储该字段元素的底层RepeatedPtrField
。此容器类提供类似 STL 的迭代器和其他方法。RepeatedPtrField<string>* mutable_foo()
:返回存储该字段元素的底层可变RepeatedPtrField
的指针。此容器类提供类似 STL 的迭代器和其他方法。
embed message
给定消息类型
代码语言:javascript复制message Bar {}
对于这些字段定义
代码语言:javascript复制//proto2
optional Bar foo = 1;
required Bar foo = 1;
//proto3
Bar foo = 1;
编译器将生成以下访问器方法
bool has_foo() const
:如果设置了该字段,则返回true
。const Bar& foo() const
:返回字段的当前值。如果字段未设置,则返回一个未设置任何字段的Bar
(可能是Bar::default_instance()
)。Bar* mutable_foo()
:返回指向存储字段值的Bar
可变对象的指针。如果在调用之前未设置字段,则返回的Bar
将未设置任何字段(即它将与新分配的Bar
相同)。调用此方法后,has_foo()
将返回true
,foo()
将返回对Bar
相同实例的引用。void clear_foo()
:清除字段的值。调用此方法后,has_foo()
将返回false
,foo()
将返回默认值。void set_allocated_foo(Bar* bar)
:将Bar
对象设置为字段,并在存在的情况下释放之前的字段值。如果Bar
指针不为NULL
,则消息将获取已分配Bar
对象的所有权,has_foo()
将返回true
。否则,如果Bar
为NULL
,则行为与调用clear_foo()
相同。Bar* release_foo()
:释放字段的所有权并返回Bar
对象的指针。调用此方法后,调用方获取已分配Bar
对象的所有权,has_foo()
将返回false
,foo()
将返回默认值。
repeat
给定消息类型
代码语言:javascript复制message Bar {}
对于此字段定义
代码语言:javascript复制repeated Bar foo = 1;
编译器将生成以下访问器方法
int foo_size() const
:返回字段中当前的元素数量。要检查空集,请考虑使用底层RepeatedField
中的empty()
方法,而不是此方法。const Bar& foo(int index) const
:返回给定零基索引处的元素。使用 [0, foo_size()) 范围之外的索引调用此方法将产生未定义的行为。Bar* mutable_foo(int index)
:返回存储给定零基索引处元素值的Bar
可变对象的指针。使用 [0, foo_size()) 范围之外的索引调用此方法将产生未定义的行为。Bar* add_foo()
:将新元素添加到该字段的末尾并返回指向该元素的指针。返回的Bar
是可变的,并且不会设置其任何字段(即它将与新分配的Bar
相同)。void clear_foo()
:从字段中删除所有元素。调用此方法后,foo_size()
将返回零。const RepeatedPtrField<Bar>& foo() const
:返回存储该字段元素的底层RepeatedPtrField
。此容器类提供类似 STL 的迭代器和其他方法。RepeatedPtrField<Bar>* mutable_foo()
:返回指向存储字段元素的底层可变RepeatedPtrField
的指针。此容器类提供类似 STL 的迭代器和其他方法。
------本页内容已结束,喜欢请分享------