您好我正在使用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”中。
我不知道发生了什么。有人知道是什么问题???
答案 0 :(得分:1)
你正在寻找的答案是在错误信息:)它只是有点难以解析它实际告诉你的内容。
基本上是什么
枚举值是他们类型的兄弟姐妹,而不是它的孩子
意味着,不是将枚举值定义为MyEnum.FOO
和MyEnum2.FOO
,而是将其作为与MyEnum 处于同一级别。因此,同一.proto文件中的两个枚举值不能具有相同的名称;他们都试图以FOO
的形式存在于该文件中,而不是MyEnum.FOO
和MyEnum2.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