protobuf是google推出的一个非常好用的工具,
protobuf version diff
在不同protobuf的版本间会有细微的不同。
在2.4.0及更早版本中,生成的C++代码会将枚举类型的值放在全局命名空间中,而不是将枚举附属于具体的枚举类型作用域之下。这种情况下,枚举值通过ENUMTYPE_ENUMVALUE
的形式出现,其中ENUMTYPE
是枚举类型的名字,ENUMVALUE
是枚举值的名字,它们之间通过下划线连接。因此,在这些老版本的protobuf生成的代码中,你会看到使用下划线来访问枚举值。
从protobuf 2.4.1起,开始支持基于C++11的特性,其中一个显著的改变就是枚举被生成为强类型枚举(enum class
),且放置在其枚举类型作用域之下,这意味着从此版本开始,就不再需要通过下划线来访问嵌套的枚举值,而是采用更现代的作用域解析操作符(::
)。
当采用高于protobuf 2.4.0版本时,开发者也可以通过编译选项选择兼容,使生成的代码符合旧的访问模式。但是,随着C++11标准的普及和社区的推进,新的代码和项目都鼓励使用枚举类型的作用域访问枚举值(即使用::
操作符),因为这提供了更好的类型安全性和清晰的命名空间划分,避免了不同枚举类型之间枚举值名称冲突的问题。
例如,在更新的protobuf版本中,如果有如下的.pr