正如您所知,当您使用全局范围或相同的消息在Google protobuf中定义枚举时,如果枚举是兄弟,则无法将枚举字段名称定义为相同。
即使您要使用proto文件生成Java代码,protoc也会抱怨它,并且生成任何带有以下消息的代码。
"XXX" is already defined in "your.package.name".
Note that enum values use C++ scoping rules, meaning that enum values are siblings of their type,
not children of it.
Therefore, "XXX" must be unique within "your.package.name", not just within "your_enum_name".
所以,这意味着你应该做一些像
这样的事情或
或
似乎C ++ 11支持没有这个问题的更好的枚举,但遗憾的是最新的protoc并不支持它,我们不能简单地要求其他消费者转换他们的一面使用C ++如果他们没有使用它。
所以,它会选择不那么糟糕的解决方案而不是最佳解决方案,而且我们可能会在这一点上使用#2。有没有人有相同的经验,告诉我你的解决方案是什么?它是如何结束的?
答案 0 :(得分:11)
现有代码中的主流解决方案是选项(2):为每个枚举名称指定与其类型对应的前缀。这也有助于减少与宏的冲突。它很冗长,但与其他建议的选项不同,它没有运行时开销,并且对于阅读代码的人来说创建的混乱最少。
(FWIW,Cap'n Proto通过使用C ++ 11枚举类逃脱了这个问题。由于它会破坏现有代码,所以protobufs不太可能这样做。)
(披露:我是Cap'n Proto的作者以及Google的大部分开源Protobuf代码。)