协议缓冲区:枚举问题

发布于 2024-12-13 04:07:26 字数 426 浏览 0 评论 0原文

我有以下 .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”必须是 unique ,不仅仅是在“Enum2”内。

我有什么办法可以克服这个问题!

I have the following .proto file :

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

When I try to comile it using protoc , I get the following error :

proto.proto:19:5: "X" is already defined proto.proto:19:5: Note that
enum values use C++ scoping rules, meaning that enum values are
siblings of their type, not children of it. Therefore, "X" must be
unique , not just within "Enum2".

I there any way I could overcome this issue !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦纸 2024-12-20 04:07:27

而不是

message SomeClass{
required  Enum1 enum1=1;
required Enum2 enum2=2; }

我认为你应该有类似

message SomeClass{
    required  Enum1 enum1.Y;
    required Enum2 enum2.Z;
}

编辑的东西:你将其标记为Java,但在你提到的问题中你提到了c ++,它是什么?

编辑2:
经过一番谷歌搜索后,我发现了这个http://www.mail-archive。 com/[email protected]/msg04986.html

您需要将 enum1.X 或 enum2.x 重命名为其他名称,以便它们不会发生冲突。

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

如果由于应用程序依赖性你真的不能,我想你需要以某种方式重新设计你的程序..

instead of

message SomeClass{
required  Enum1 enum1=1;
required Enum2 enum2=2; }

i think you should have something like

message SomeClass{
    required  Enum1 enum1.Y;
    required Enum2 enum2.Z;
}

edit: you tagged this as Java, but in the question you refer to c++, witch one it is?

edit2:
After googling a bit I found this http://www.mail-archive.com/[email protected]/msg04986.html

you need to rename enum1.X or enum2.x to some other name so that they don't conflict.

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

if you really cant because of application dependencies i guess you need to redesign your program somehow..

蝶…霜飞 2024-12-20 04:07:26

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

示例:

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;
}

You could include your enum inside another message so the visibility will not conflict.

Exemple :

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;
}

You could also prefix your enum value with something. If you don't change the number after the name of your value, it should stay compatible with your old version :
ex:

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;
}
歌入人心 2024-12-20 04:07:26

您可以在枚举中使用前缀

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;    
}

You can use prefix in enumeration then

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;    
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文