繁体   English   中英

协议缓冲区使用枚举

[英]Protocol Buffer use enum

您好,我正在使用 protobuf,但我遇到了问题。

我有一些枚举函数,但在其中我有相同的别名,当我尝试为某种语言“go”编译文件时,编译器返回错误。

我复制了 protobuf 文档中的示例来定义枚举,但仍然无法正常工作。

enum EnumAllowingAlias {
  option allow_alias = true;
  UNKNOWN = 0;
  STARTED = 1;
  RUNNING = 1;
}
enum EnumNotAllowingAlias {
  UNKNOWN = 0;
  STARTED = 1;
  // RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.
}

这是谷歌文档说如果你需要在一些不同的枚举中使用相同的别名,你需要添加选项“option allow_alias = true;” 在枚举中,但在尝试编译 .proto 文件后,编译器响应。

example.proto:13:5:“UNKNOWN”已在“命名空间”中定义。
example.proto:13:5:请注意,枚举值使用 C++ 范围规则,这意味着枚举值是其类型的同级,而不是其子级。
因此,“UNKNOWN”在“kluso”中必须是唯一的,而不仅仅是在“EnumNotAllowingAlias”中。

example.proto:14:5:“开始”已经在“命名空间”中定义。
example.proto:14:5:请注意,枚举值使用 C++ 范围规则,这意味着枚举值是其类型的同级,而不是其子级。
因此,“STARTED”在“kluso”中必须是唯一的,而不仅仅是在“EnumNotAllowingAlias”中。

我不知道发生了什么。 有人知道是什么问题吗?

allow_alias 允许您为相同的值使用两个不同的名称

但是,它仍然不允许使用相同的名称两次!

在您从文档中获取的示例中,他们只是试图通过将 allow_alias 设置为 true 来演示如何在相同的枚举类型中使用 STARTED = 1 和 RUNNING = 1 。 他们给出的两个枚举示例并不打算在同一个包中使用。

但是,如果您已经在 EnumAllowingAlias 中使用了 RUNNING,则如果它们在同一个包中,则不能在 EnumNotAllowingAlias 中再次使用 RUNNING。

您正在寻找的答案在错误消息中 :) 解析它实际告诉您的内容有点困难。

基本上,什么

枚举值是它们类型的兄弟,而不是它的孩子

意思是,枚举值的范围MyEnum.FOOMyEnum2.FOOMyEnum2.FOO它们的范围与MyEnum2.FOO相同 所以同一个 .proto 文件中的两个枚举值不能具有相同的名称; 他们都试图在该文件中作为FOO存在,而不是MyEnum.FOOMyEnum2.FOO

我不明白你的意思,因为我有两个名字不同的枚举,第一个是 EnumAllowingAlias,第二个是 EnumNotAllowingAlias 这是例子

https://developers.google.com/protocol-buffers/docs/proto#enum

在他们解释的例子之前

“您可以通过为不同的枚举常量分配相同的值来定义别名。为此,您需要将 allow_alias 选项设置为 true,否则协议编译器将在找到别名时生成错误消息。”

在这种情况下,我可以创建 2 个这样的枚举,编译器应该首先使用别名创建两个枚举,第二个没有别名,但编译器在第一个答案中向我发送了错误。

EnumAllowingAlias 和 EnumNotAllowingAlias 不能定义在同一个 proto 文件中,它们只是理解 allow_alias 用法的两个例子。

allow_alias 只在同一个枚举中工作,正如 mahdt 所说,allow_alias 允许你在一个枚举中为相同的值使用两个不同的名称,EnumAllowingAlias 就是这种情况的例子:

enum EnumAllowingAlias {
  option allow_alias = true;
  UNKNOWN = 0;
  STARTED = 1;
  RUNNING = 1;
}

如果 allow_alias 未设置为 true,则 EnumNotAllowingAlias 将收到错误:

enum EnumNotAllowingAlias {
  UNKNOWN = 0;
  STARTED = 1;
  RUNNING = 1;  // Uncommenting this line will cause a compile error inside Google and a warning message outside.
}

Enum的使用在Java中没有这个限制,我觉得对于大多数开发者来说真的很困惑,所以我提出了一个错误报告: https : //github.com/protocolbuffers/protobuf/issues/5425

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM