【Protobuf速成指南】enum类型的使用 |
您所在的位置:网站首页 › find函数语法结构 › 【Protobuf速成指南】enum类型的使用 |
文章目录
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 |