我的C/C++语言学习进阶之旅什么是.pb.h 和 .pb.cc 文件?

Posted 字节卷动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的C/C++语言学习进阶之旅什么是.pb.h 和 .pb.cc 文件?相关的知识,希望对你有一定的参考价值。

一、问题来源

为什么会提问: 什么是.pb.h 和 .pb.cc 文件?

因为我最近在看Mediapipe的源码时,在部分.cc文件中有很多头文件的名字是类似 XXX.pb.h的,
这引起了我的好奇心:这些 XXX.pb.h到底是什么?

二、探索问题

有问题就要去寻找答案。最终我通过下面的几个链接的内容,大致了解了问题的答案。读者也可以查阅这几篇文章看看。

三、总结

3.1 什么是Protocol Buffer

3.1.1 Protocol Buffer简介

Protocol Buffers (Protobuf) 是一种免费的开源跨平台数据格式,用于序列化结构化数据

它在开发程序以通过网络相互通信或存储数据时很有用。

该方法涉及描述某些数据结构的接口描述语言和从该描述生成源代码以生成或解析表示结构化数据的字节流的程序。

Protocol Buffers (Protobuf)Google 的语言中立、平台中立、可扩展的结构化数据序列化机制——类似XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,并使用各种语言。

3.1.2 Protocol Buffers (Protobuf)如何定义

Protocol Buffers (Protobuf) 由文件.proto文本文件定义,我们可以轻松地阅读并理解。

3.1.3 更多阅读

更多关于Protocol Buffers (Protobuf)的资料可以参考:

3.2 什么是.pb.h 和 .pb.cc 文件?

结论:其实.pb.h.pb.cc 文件就是 protoc编译器根据 .proto 文件,编译生成对应的头文件实现文件

更多关于.proto文件如何生成.pb.h 和 .pb.cc 文件的可以参考下面的链接:

protoc编译器为每个 .proto 文件输入创建一个头文件和一个实现文件。输出文件的名称是通过获取 .proto 文件的名称并进行两项更改来计算的:

  • 对于头文件实现文件,扩展名 (.proto) 分别替换为 .pb.h.pb.cc
  • proto 路径(由 --proto_path= 或 -I 命令行标志指定)被替换为输出路径(由 --cpp_out= 标志指定)。
    因此,例如,假设您按如下方式调用编译器:
protoc --proto_path=src --cpp_out=build/gen src/foo.proto src/bar/baz.proto

编译器将读取文件 src/foo.protosrc/bar/baz.proto 并生成四个输出文件:

  • build/gen/foo.pb.h
  • build/gen/foo.pb.cc
  • build/gen/bar /baz.pb.h
  • build/gen/bar/baz.pb.cc

如果需要,编译器会自动创建目录 build/gen/bar,但不会创建 buildbuild/gen;它们必须已经存在

3.3 一个示例

定义一个 polyline.proto,如下所示:

//polyline.proto
syntax = "proto2";

message Point 
  required int32 x = 1;
  required int32 y = 2;
  optional string label = 3;


message Line 
  required Point start = 1;
  required Point end = 2;
  optional string label = 3;


message Polyline 
  repeated Point point = 1;
  optional string label = 2;

Point 消息定义了两个强制性数据项,xylabel是可选的。每个数据项都有一个tagtag在等号之后定义。例如,x 具有的tag1

LinePolyline消息都使用了Point 消息,演示了组合在 Protocol Buffers 中的工作方式。Polyline有一个repeated的字段,其行为类似于vector

随后可以编译此模式以供一种或多种编程语言使用。 Google 提供了一个名为 protoc 的编译器,它可以为 C++、Java 或 Python 生成输出。其他模式编译器可从其他来源获得,用于为 20 多种其他语言创建与语言相关的输出。

例如,在生成上述协议缓冲区模式的 C++ 版本后,C++ 源代码文件 polyline.cpp 可以使用如下消息对象:

polyline.cpp 文件如下所示:

// polyline.cpp
#include "polyline.pb.h"  // generated by calling "protoc polyline.proto"

Line* createNewLine(const std::string& name) 
  // create a line from (10, 20) to (30, 40)
  Line* line = new Line;
  line->mutable_start()->set_x(10);
  line->mutable_start()->set_y(20);
  line->mutable_end()->set_x(30);
  line->mutable_end()->set_y(40);
  line->set_label(name);
  return line;


Polyline* createNewPolyline() 
  // create a polyline with points at (10,10) and (20,20)
  Polyline* polyline = new Polyline;
  Point* point1 = polyline->add_point();
  point1->set_x(10);
  point1->set_y(10);
  Point* point2 = polyline->add_point();
  point2->set_x(20);
  point2->set_y(20);
  return polyline;

以上是关于我的C/C++语言学习进阶之旅什么是.pb.h 和 .pb.cc 文件?的主要内容,如果未能解决你的问题,请参考以下文章

我的C语言学习进阶之旅关于C/C++内存对齐读取文件产生的问题以及解决方法

我的OpenGL学习进阶之旅C++如何加载TGA文件?

我的OpenGL学习进阶之旅C++如何加载TGA文件?

我的C/C++语言学习进阶之旅C语言标识符的命名规则和分类

我的C/C++语言学习进阶之旅C语言标识符的命名规则和分类

我的C/C++语言学习进阶之旅介绍一下NDK开发之C的简单易用图像库stb