You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何合法.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:12:05