建筑案例的网站有哪些方面,温州哪家做网站,威海网站开发制作,自己的电脑做服务器建立网站的方法目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则
消息的字段可以⽤下⾯⼏种规则来修饰#xff1a; singular#xff1a;消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中#xff0c;字段默认使⽤该规则 repeat… 目录 1.字段规则2.消息类型的定义与使用1.定义2.使用 3.enum类型1.语法2.定义时注意3.代码 1.字段规则
消息的字段可以⽤下⾯⼏种规则来修饰 singular消息中可以包含该字段零次或⼀次(不超过⼀次) proto3语法中字段默认使⽤该规则 repeated消息中可以包含该字段任意多次(包括零次)其中重复值的顺序会被保留 可以理解为定义了⼀个数组 示例表示一个通讯录里有多个人的信息message Contacts
{repeated PeopleInfo contacts 1;
}2.消息类型的定义与使用
1.定义
在单个.proto⽂件中可以定义多个消息体且⽀持定义嵌套类型的消息(任意多层) 每个消息体中的字段编号可以重复 更新contacts.proto可以将phone_number提取出来单独成为⼀个消息// -------------------------- 嵌套写法 -------------------------
syntax proto3;
package contacts;message PeopleInfo
{string name 1; int32 age 2; message Phone {string number 1;}
}
// -------------------------- ⾮嵌套写法 ------------------------
syntax proto3;
package contacts;message Phone
{string number 1;
}message PeopleInfo
{string name 1; int32 age 2;
}2.使用
消息类型可作为字段类型使用syntax proto3;
package contacts;// 联系⼈
message PeopleInfo
{string name 1; int32 age 2; message Phone {string number 1; }repeated Phone phone 3;
}可导入其他.proto文件的消息并使用import导入syntax proto3;
package contacts;
import phone.proto; // 使⽤ import 将 phone.proto ⽂件导⼊进来message PeopleInfo
{string name 1; int32 age 2; // 引⼊的⽂件声明了package使⽤消息时需要⽤ ‘命名空间.消息类型’ 格式 repeated phone.Phone phone 3;
}注意在proto3⽂件中可以导⼊proto2消息类型并使⽤它们反之亦然说明 每个字段都有⼀个clear_⽅法可以将字段重新设置回empty状态每个字段都有设置和获取的⽅法 获取⽅法的⽅法名称与字段命名完全相同 但如果是消息类型的字段其设置⽅法为mutable_⽅法返回值为消息类型的指针这类⽅法会为用户开辟好空间可以直接对这块空间的内容进⾏修改 mutable - 访问和修改消息字段中的嵌套消息 对于使⽤repeated修饰的字段也就是数组类型pb为用户提供 add_⽅法来新增⼀个值_size⽅法来判断数组存放元素的个数 3.enum类型
1.语法
语法enum Type
{}注意 0值常量必须存在且要作为第⼀个元素 这是为了与proto2的语义兼容第⼀个元素作为默认值且值为0 枚举类型可以在消息外定义也可以在消息体内定义(嵌套)枚举的常量值在32位整数的范围内 负值⽆效所以不建议使⽤负值
2.定义时注意
将两个具有相同枚举值名称的枚举类型放在单个.proto⽂件下测试时编译后会报错某某某常量已经被定义所以这⾥要注意 同级(同层)的枚举类型各个枚举类型中的常量不能重名enum PhoneType
{MP 0;TEL 1;
}
enum PhoneTypeCopy
{MP 0; // ERRORMP 已经定义
}单个.proto⽂件下最外层枚举类型和嵌套枚举类型不算同级enum PhoneTypeCopy
{MP 0; // ⽤法正确
}message Phone
{string number 1;enum PhoneType {MP 0;TEL 1;}
}多个.proto⽂件下若⼀个⽂件引⼊了其他⽂件且每个⽂件都未声明package每个proto⽂件中的枚举类型都在最外层算同级// phone1.proto
import phone1.proto
enum PhoneType
{MP 0; // ERRORMP 已经定义TEL 1;
}// phone2.proto
enum PhoneTypeCopy
{MP 0;
}多个.proto⽂件下若⼀个⽂件引⼊了其他⽂件且每个⽂件都声明了package不算同级// phone1.proto
import phone1.proto
package phone1;
enum PhoneType
{MP 0; // ⽤法正确TEL 1;
}// phone2.proto
package phone2;
enum PhoneTypeCopy
{MP 0;
}3.代码
编译生成的CPP代码// 新⽣成的 PeopleInfo_Phone_PhoneType 枚举类
enum PeopleInfo_Phone_PhoneType : int
{PeopleInfo_Phone_PhoneType_MP 0,PeopleInfo_Phone_PhoneType_TEL 1,PeopleInfo_Phone_PhoneType_PeopleInfo_Phone_PhoneType_INT_MIN_SENTINEL_DO_NOT_USE_ std::numeric_limitsint32_t::min(),PeopleInfo_Phone_PhoneType_PeopleInfo_Phone_PhoneType_INT_MAX_SENTINEL_DO_NOT_USE_ std::numeric_limitsint32_t::max()
};// 更新的 PeopleInfo_Phone 类
class PeopleInfo_Phone final : public ::PROTOBUF_NAMESPACE_ID::Message
{
public:typedef PeopleInfo_Phone_PhoneType PhoneType;static inline bool PhoneType_IsValid(int value) {return PeopleInfo_Phone_PhoneType_IsValid(value);}templatetypename Tstatic inline const std::string PhoneType_Name(T enum_t_value) {...}static inline bool PhoneType_Parse(::PROTOBUF_NAMESPACE_ID::ConstStringParam name, PhoneType* value) {...}// .contacts.PeopleInfo.Phone.PhoneType type 2;void clear_type();::contacts::PeopleInfo_Phone_PhoneType type() const;void set_type(::contacts::PeopleInfo_Phone_PhoneType value);
};上述的代码中 对于在.proto⽂件中定义的枚举类型编译⽣成的代码中会含有 与之对应的枚举类型校验枚举值是否有效的⽅法_IsValid以及获取枚举值名称的⽅法_Name 对于使⽤了枚举类型的字段包含设置和获取字段的⽅法已经清空字段的⽅法clear_