8

我的代码当前传递了很多(有时是嵌套的)C(或 C++ 普通旧数据)结构和数组。

我想将这些转换为/从谷歌 protobufs 转换。我可以手动编写在这两种格式之间转换的代码,但自动生成这样的代码不太容易出错。做这个的最好方式是什么?(这在具有足够内省以迭代成员变量名称的语言中很容易,但这是我们正在谈论的 C++ 代码)

我正在考虑的一件事是编写解析 C 结构然后输出 .proto 文件的 python 代码,以及从成员到成员(在任一方向)复制所有类型的 C 代码,但也许有一个更好的方法......或者也许已经可以生成另一个 IDL:

  1. .h 文件包含所有嵌套类型
  2. .proto 文件包含等价物
  3. .c 文件,其中包含在 .proto 文件生成的 C++ 结构和 .h 文件中定义的结构之间复制任一方向的函数
4

3 回答 3

0

可以通过使用TextFormat解析 ASCII 表示来构建协议缓冲区。因此,一种选择是dumpAsciiProtoBuf为每个结构添加一个方法。该方法将转储任何简单字段(如字符串、布尔值等)并dumpAsciiProtoBuf在嵌套结构字段上递归调用。然后,您必须确保连接的结果是可以使用TextFormat解析的有效 ASCII 协议缓冲区。

请注意,这可能会对性能产生一些影响(因为解析 ASCII 表示可能很昂贵)。但是,这样可以省去用不同语言编写转换器的麻烦,所以这似乎是一个方便的解决方案。

于 2012-10-25T20:22:00.550 回答
0

我不会自己解析 C 源代码,而是使用LibClang将 C 文件解析为AST和我自己的 AST walker 以根据需要生成Protobuf和转码器。谷歌搜索“libclang walk AST”应该提供一些开始,比如ast-walker.ccast-dumper.cc来自这个 github 存储库,例如。

于 2018-09-05T09:27:48.957 回答
0

我找不到解决此问题的现成解决方案,如果有,请告诉我!

如果你决定在 python 中使用你自己的,gdb 的 python 绑定可能会很有用。然后,您可以读取符号表,查找指定文件中定义的所有结构,并迭代所有结构成员。然后用于<gdbtype>.strip_typedefs()获取每个成员的原始类型并将其转换为适当的 protobuf 类型。

这可能比文本解析器更安全,因为它将处理依赖于体系结构、编译器标志、预处理器宏等的类型。

我猜想从 struct 成员到消息字段的关系也可以生成与 protobuf 相互转换的代码,但听起来并不容易。

于 2016-11-28T18:41:12.570 回答