如何使用C++读取Protobuf的oneof类型消息?
解答
你使用的是面向嵌入式场景的轻量级Protobuf实现nanopb,它生成的是纯C风格结构体,和谷歌官方C++ Protobuf库的生成代码逻辑完全不同,因此官方C++参考文档的API不匹配。你可以直接通过生成结构体的which_some_options字段判断oneof当前生效的字段,用法示例如下:
// 引入你生成的nanopb头文件 #include "your_generated_proto_header.h" void handle_message(const namespace_name_MessageName& msg) { switch (msg.which_some_options) { // 对应Protobuf定义中optionAName的字段编号1,宏为nanopb自动生成 case _namespace_name_MessageName_optionAName_tag: // 读取OptionA值的方式:msg.some_options.optionAName // 此处替换为OptionA对应的业务逻辑 deal_with_option_a(msg.some_options.optionAName); break; // 对应Protobuf定义中optionBName的字段编号2,宏为nanopb自动生成 case _namespace_name_MessageName_optionBName_tag: // 读取OptionB值的方式:msg.some_options.optionBName // 此处替换为OptionB对应的业务逻辑 deal_with_option_b(msg.some_options.optionBName); break; // 未设置任何oneof字段的默认情况 default: break; } }
补充说明
which_<oneof名>字段的合法取值是nanopb自动生成的宏,命名规则为_<结构体全名>_<字段名>_tag,取值和你在Protobuf定义中给字段分配的编号一致- 如果oneof没有设置任何值,
which_some_options的取值为0 - C++项目可以直接按C结构体的规则访问该结构,不需要额外调用API
内容的提问来源于stack exchange,提问作者C. E.
相关产品推荐
相关产品推荐

