【Protobuf速成指南】enum类型的使用

您所在的位置:网站首页 find函数语法结构 【Protobuf速成指南】enum类型的使用

【Protobuf速成指南】enum类型的使用

2023-06-17 18:37| 来源: 网络整理| 查看: 265

文章目录 2.1枚举类型一、如何定义枚举类型?二、语法规范三、重定义问题四、enum类型相关函数五、Contact 2.1 改写六、总结

2.1枚举类型

 本系列文章将通过对通讯录项目的不断完善,带大家由浅入深的学习Protobuf的使用。这是Contacts的2.1版本,在这篇文章中将带大家学习Protobuf的enum类型语法,并将其用到我们的项目中

一、如何定义枚举类型?

.proto文件中可以定义枚举类型。如下我们可以定义了一个PhoneType枚举类型:

enum PhoneType{ MOBILE = 0; FIXED = 1; }

🎯[书写规范]:

枚举类型名建议采用驼峰命名,开头大写enum 类型成员被定义为具名常量。常量命名建议全部使用大写,多个字母之间使用_连接,例如:ENUM_COUNT = 0 二、语法规范

0值常量必须存在,且要作为第一个元素。这是为了与proto2的语义兼容:第一个元素作为默认值,且值为0。

// 错误示范1: 0值常量必须存在 enum PhoneType{ MOBILE = 1; FIXED = 2; } // 错误示范2:0值常量必须作为第一个元素 enum PhoneType{ FIXED = 1; MOBILE = 0; }

枚举类型除了可以在消息外定义,也可以在消息体内定义(嵌套)

message PeopleInfo{ // …… enum PhoneType{ FIXED = 0; MOBILE = 1; } }

枚举的常量值在32位整数的范围内。但因负值无效因而不建议使用(与编码规则有关)

三、重定义问题

 将两个具有相同枚举值名称的枚举类型放在单个.proto文件下测试时,编译后会报错:某某某常量已经被定义。我们来总结这个问题

同级的枚举常量名不能重复

//【错误】:同级的MOBILE名发生重复 enum PhoneType{ MOBILE = 0; } enum PhoneTypeCopy{ MOBILE = 0; }

处于非同级的枚举常量名可以重复

// 【正确】: 处于不同级的枚举常量名可以重复 enum PhoneType{ MOBILE = 0; } message PeopleInfo{ enum PhoneTypeCopy{ MOBILE = 0; } }

引入另一个.proto文件时,同级的枚举常量名不能重复

// 【错误】:同级的MOBILE名发生重复 // ----------------- phone.proto ------------------- enum PhoneType{ MOBILE = 0; } // ---------------- contact.prot ----------------- import phone.proto enum PhoneType{ MOBILE = 0; }

引入另一个.proto文件时,如果两个文件在不同的package下,则枚举常量名可以重复。package起到了隔离的作用,避免了冲突的发生

// 【正确】:因为处于不同的package下 // ----------------- phone.proto ------------------- package phone enum PhoneType{ MOBILE = 0; } // ---------------- contact.prot ----------------- import phone.proto enum PhoneType{ MOBILE = 0; }

🎯[总结]:

同级的枚举常量名不能重复处于不同package下的常量名可以重复 四、enum类型相关函数 // 原始版本 message PeopleInfo{ string name = 1; int32 age = 2; message Phone{ string number = 1; string type = 2; } repeated Phone phone = 3; }

将Phone的type类型改为枚举类型:

// 修改后的版本 message PeopleInfo{ string name = 1; int32 age = 2; message Phone{ string number = 1; enum PhoneType{ MOBILE = 0; FIXED = 1; } PhoneType type = 2; } repeated Phone phone = 3; }

对上面修改后的 .proto 文件进行编译后,观察生成的 .h 的变化

// 新生成了枚举类 enum PeopleInfo_Phone_PhoneType : int { PeopleInfo_Phone_PhoneType_MOBILE = 0, PeopleInfo_Phone_PhoneType_FIXED = 1, // …… };

 对枚举类型 type 和 PhoneType 类型新生成的部分函数(注意枚举常量名和枚举常量值表达意思的不同)

// 检验value是不是有效的枚举常量值 static inline bool PhoneType_IsValid(int value); // 返回枚举常量值对应的枚举常量名 static inline const std::string& PhoneType_Name(T enum_t_value); // 将枚举常量名解析为对应的枚举常量值 static inline bool PhoneType_Parse(const std::string& name, PhoneType* value) // ----------------------------------------------------------------- // 获取type的枚举常量值 ::contacts::PeopleInfo_Phone_PhoneType type() const; // 设置为默认值,即值为0的枚举值 void clear_type(); // 设置枚举类型值 void set_type(::contacts::PeopleInfo_Phone_PhoneType value); // value 为上一代码块提到的枚举类,例如“PeopleInfo_Phone_PhoneType_MOBILE” 五、Contact 2.1 改写

write.cc修改

#include #include #include "contact.pb.h" using namespace std; void AddPeopleInfo(contact2::PeopleInfo* p){ cout case 0: phone->set_type(contact2::PeopleInfo_Phone_PhoneType_MOBILE); break; case 1: phone->set_type(contact2::PeopleInfo_Phone_PhoneType_FIXED); break; default: cout cerr // 从输出流中反序列化 cerr for(int i = 0; i cout cerr


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3