协议缓冲区:枚举问题

2022-09-01 17:31:22

我有以下.proto文件:

enum Enum1{
    X=0;
    Y=1;    
}
message SomeClass{
    required  Enum1 enum1=1;
    required Enum2 enum2=2;
}
enum Enum2{
    X=0;
    Z=1;    
}

当我尝试使用protoc进行嘲笑时,我得到以下错误:

proto.proto:19:5: “X” 已经定义了 proto.proto:19:5:请注意,枚举值使用C++范围规则,这意味着枚举值是其类型的同级,而不是其子级。因此,“X”必须是唯一的,而不仅仅是在“Enum2”中。

我有任何方法可以克服这个问题!


答案 1

您可以将枚举包含在另一条消息中,以便可见性不会发生冲突。

示例 :

message Enum1{
 enum Enum{
     X=0;
     Y=1;    
 }
}

message Enum2{
 enum Enum{
     X=0;
     Y=1;    
 }
}

message SomeClass{
    required  Enum1.Enum enum1=1;
    required Enum2.Enum enum2=0;
}

您还可以在枚举值前面加上一些前缀。如果您不更改值名称后面的数字,它应该与旧版本保持兼容:例如:

enum Enum1{
    E1_X=0;
    E1_Y=1;    
}
enum Enum2{
    E2_X=0;
    E2_Z=1;    
}
message SomeClass{
    required  Enum1 enum1=1;
    required Enum2 enum2=2;
}

答案 2

您可以在枚举中使用前缀,然后

enum Enum1{
    E1_X=0;
    E1_Y=1;    
}
message SomeClass{
    required Enum1 enum1=1;
    required Enum2 enum2=2;
}
enum Enum2{
    E2_X=0;
    E2_Z=1;    
}

推荐