文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。
笔记资料仅供学习交流使用,转载请标明出处,谢谢配合。
如果存在相关知识点的遗漏,可以在评论区留言,看到后将在第一时间更新。
作者:Aliven888
问题描述
我定义了两个 proto (aliven1.proto
和 aliven2.proto
),枚举类型中都包含 kUnknown
字段。在使用时会报错如下:
# aliven1.proto
syntax = "proto3";
package aliven.proto;
enum Aliven1Status {
kUnknown = 0;
# todo ...
}
message FusionSystemMsg {
Aliven1Status aliven_sts = 1;
# todo ...
}
# aliven2.proto
syntax = "proto3";
package aliven.proto;
enum Aliven2Status {
kUnknown = 0;
# todo ...
}
message FusionSystemMsg {
Aliven2Status aliven_sts = 1;
# todo ...
}
报错信息
> error: ‘kUnknown’ conflicts with a previous declaration
> note: previous declaration ‘aliven::proto::Aliven1Status aliven::proto::kUnknown’
> error: cannot convert ‘aliven::proto::Aliven2Status::kUnknown’ to ‘const aliven::proto::Aliven1Status::kUnknown’ in initialization
问题分析
两个 proto 中都有 kUnknown
字段(虽然 enum
对象名不一样),而且两个作用域是 aliven::proto
; 所以会报错 kUnknown
字段会报错重复声明。
问题解决方案
在操作 proto 时,如果作用域相同时(同为xxx::proto
),尽量不要定义重复的变量 或者 枚举(enum
)名称。
两个 enum
做出如下修改即可(加个前缀)解决该问题。
# aliven1.proto
enum Aliven1Status {
kAliven1Unknown = 0;
# todo ...
}
# aliven2.proto
enum Aliven2Status {
kAliven2Unknown = 0;
# todo ...
}