为何合法.proto定义在C++中因枚举名冲突导致protoc失败?
解决不可修改Proto文件生成C++代码的枚举冲突问题
问题场景
有一份不可修改的公共Proto文件:
syntax = "proto2"; package openrtb; enum ContentCategory { IAB1 = 1; IAB1_1 = 2; IAB1_2 = 3; IAB11 = 191; IAB11_1 = 192; }
执行以下protoc命令生成C++代码时出现警告且未生成文件:
protoc --proto_path=. --cpp_out=./src --grpc_out=./src --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` test2.proto
报错信息:
test2.proto:9:3: Enum name IAB11 has the same name as IAB1_1 if you ignore case and strip out the enum name prefix (if any). (If you are using allow_alias, please assign the same number to each enum value name.)
相同文件生成Go代码可正常完成,需在不修改Proto文件的前提下生成有效C++代码。
解决方法
在protoc命令中添加--allow_case_conflict参数,该参数会允许枚举值名称存在大小写/下划线导致的冲突,绕过C++代码生成时的检查。修改后的命令如下:
protoc --allow_case_conflict --proto_path=. --cpp_out=./src --grpc_out=./src --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` test2.proto
该参数专门用于处理这类无法修改原始Proto文件,但因枚举命名规则冲突导致C++代码生成失败的场景,不会影响生成代码的功能正确性。
内容的提问来源于stack exchange,提问作者anish
相关产品推荐
相关产品推荐

