谷歌协议缓冲区:如何使用谷歌协议缓冲区创建联合体

16

我目前正在尝试在C语言中使用Google Protocol Buffers。 我有点不确定如何使用GPB创建C联合体。

例如,如果有以下proto文件:

message msgToSend
{
 required Type msg_type=1; //Type is a predefined enum to determine message type
 optional ReqMsg1 msg1=2;
 optional ReqMsg2 msg2=3;
}

我期望上述代码在编译时生成一个union,但实际上生成了如下结构体:

struct _msgToSend
{
 ProtobufCMessage base;
 Type msg_type;
 ReqMsg1 msg1;
 ReqMsg2 msg2;
}

6
请考虑接受这个回答,它提到了oneof(https://dev59.com/7FsV5IYBdhLWcg3wrQgp#40040658)。我无法删除已接受的答案。 - unwind
2个回答

47

-12

我认为你做不到。

在 Protobuf 中,“optional”并不像 C 联合体那样意味着“要么是这个,要么是另一个”,而是表示“这可能存在”。这就是为什么您会得到一个能够表达两个可选字段都存在的 C 结构体。

在工作中,仅此一点就足以让我实现一个 Protobuf 替代系统,因为我们真的想要联合体。


正确!因为最终只有填充的数据被打包。 - Sphoorthi Dayanand
4
或许可以查看https://developers.google.com/protocol-buffers/docs/proto#oneof来了解联合体的用法。 - Quarra
@Quarra 哦,我不知道那个。它是很新的吗?试图弄清楚但失败了(我不关注Protobuf)。 - unwind
@unwind 目前我在项目中使用的是protobuf 2.6.1版本,其中已经包含了oneofs。据我所知,2.6.1版本是在2014年10月21日发布的。Oneofs在proto2的语言指南中有介绍,因此我认为从2.0.0版本开始就已经存在了。 - Quarra
1
根据这个答案,oneof是在2.6.0版本中发布的,该版本于2014年8月15日发布。https://dev59.com/_WEi5IYBdhLWcg3wwemq#20985344 - num1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接