Protobuf:了解原始文件的编译输出

时间:2019-02-06 11:09:35

标签: c++ protocol-buffers protoc google-protocol-buffer

**大家好, 我是protobuf的新手。我试图在这里了解基本知识。 我已在目录Test.proto中将样本原型文件创建为/path/to/Directory/

syntax = "proto2";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }**

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phone = 4;
}

并用

进行编译
 protoc -I=/path/to/Directory/ --cpp_out=/path/to/Directory/ /path/to/Directory/Test.proto

这将创建2个文件Test.pb.hTest.pb.cc。现在我可以看到类Person中有不同的函数。让我们来看一下函数(源自required string name = 1;文件的Test.proto行)

现在,编译器执行此操作并提供以下各种功能:

bool has_name() const;
void clear_name();
static const int kNameFieldNumber = 1;
const ::std::string& name() const;
void set_name(const ::std::string& value);
void set_name(::std::string&& value);
void set_name(const char* value);
void set_name(const char* value, size_t size);
::std::string* mutable_name();
::std::string* release_name();
void set_allocated_name(::std::string* name);

现在我的问题是:在哪里可以找到每个功能的描述及其作用?

2 个答案:

答案 0 :(得分:3)

起点是here(静态代码)和here(生成的代码)。后者概述了您在“特定”中的要求-搜索string* mutable_foo()string* release_foo()(请注意,proto2与proto3是重复的)。

答案 1 :(得分:2)

根据C ++生成的代码的documentation

  

string* mutable_foo():返回指向可变字符串的指针   存储字段值的对象。如果该字段未事先设置   调用,则返回的字符串将为空(不是默认值)   值)。调用此命令后,has_foo()将返回truefoo()   将返回写入给定字符串的任何值。

     

string* release_foo():释放字段的所有权并   返回字符串对象的指针。打电话后,来电者   获取分配的字符串对象的所有权,has_foo()将   返回false,foo()将返回默认值。

您可以在同一页面中找到其余功能的说明。