【我的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;
}
  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节卷动

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值