Protocol Buffer使用枚举

时间:2016-03-23 15:43:23

标签: go protocol-buffers

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

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

我复制了protobuf文档中的示例以定义枚举但仍无效。

num 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.
}

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

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

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

4 个答案:

答案 0 :(得分:1)

你正在寻找的答案是在错误信息:)它只是有点难以解析它实际告诉你的内容。

基本上是什么

  

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

意味着,不是将枚举值定义为MyEnum.FOOMyEnum2.FOO,而是将其作为与MyEnum 处于同一级别。因此,同一.proto文件中的两个枚举值不能具有相同的名称;他们都试图以FOO的形式存在于该文件中,而不是MyEnum.FOOMyEnum2.FOO

答案 1 :(得分:1)

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

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

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

但是,如果EnumAllowingAlias中已经有RUNNING,则如果它们位于同一软件包中,则不能在EnumNotAllowingAlias中再次使用RUNNING。

答案 2 :(得分:0)

我不喜欢'理解你的观点,因为我有2个带有digfferent名字的枚举,第一个是EnumAllowingAlias,而secund是EnumNotAllowingAlias,这是

中的例子
  

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

在他们解释的例子之前

  

"您可以通过为不同的枚举常量指定相同的值来定义别名。为此,您需要将allow_alias选项设置为   如果是,则协议编译器将生成错误消息   找到了别名。"

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

答案 3 :(得分:0)

EnumAllowingAlias和EnumNotAllowingAlias不能在相同的原始文件中定义,它们只是用于理解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.
}

枚举用法在Java中没有此限制,我认为这对于大多数开发人员来说确实令人困惑,因此我提出了一个错误报告: https://github.com/protocolbuffers/protobuf/issues/5425