Protobuf: понимание скомпилированного вывода прототипов - PullRequest
0 голосов
/ 06 февраля 2019

** Привет всем, я новичок в 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.h и Test.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 голосов
/ 06 февраля 2019

Согласно документации Сгенерированного кода C ++:

string* mutable_foo(): возвращает указатель на объект изменяемой строки, в котором хранится значение поля.Если поле не было установлено до вызова, возвращаемая строка будет пустой (не значение по умолчанию).После вызова этого has_foo() вернет true, а foo() вернет любое значение, записанное в данную строку.

string* release_foo(): освобождает владельца поля и возвращает указатель на строкуобъект.После вызова этого, вызывающий объект становится владельцем выделенного строкового объекта, has_foo() вернет false и foo() вернет значение по умолчанию.

Вы можете найти описания остальныхфункции на той же странице.

0 голосов
/ 06 февраля 2019

Начальная точка: здесь (статический код) и здесь (сгенерированный код).Последний включает в себя обзор того, что вы спрашиваете в своем «в частности» - поиск: string* mutable_foo() и string* release_foo() (отмечая, что они дублируются для proto2 против proto3).

...