我的代码目前传递了很多(有时是嵌套的)C(或C ++ Plain Old Data)结构和数组。
我想将这些转换为谷歌protobufs。 我可以手动编写在这两种格式之间进行转换的代码,但是自动生成此类代码的错误会更少。 做这个的最好方式是什么? (对于有足够内省的语言来迭代成员变量的名称,这很容易,但这是我们所讨论的C ++代码)
我正在考虑的一件事是编写解析C结构的python代码,然后吐出一个.proto文件,以及为所有类型从成员复制到成员(在任一方向上)的C代码,但也许有一个更好的方式……或者可能有另一个已经可以生成的IDL:
我找不到这个问题的现成解决方案,如果有的话,请告诉我!
如果你决定在python中自己推出,那么gdb的python绑定可能会很有用。 然后,您可以读取符号表,查找在指定文件中定义的所有结构,并迭代所有结构成员。 然后使用
获取每个成员的基本类型,并将其转换为适当的protobuf类型。
这可能比文本解析器更安全,因为它将处理依赖于体系结构,编译器标志,预处理器宏等的类型。
我想转换到protobuf和从protobuf转换的代码也可以从struct成员生成到消息字段关系,但听起来并不容易。
可以通过使用TextFormat解析ASCII表示来构建协议缓冲区。 因此,一种选择是将方法dumpAsciiProtoBuf
添加到每个结构中。 该方法将转储任何简单字段(如字符串, dumpAsciiProtoBuf
等),并在嵌套的结构字段上递归调用dumpAsciiProtoBuf
。 然后,您必须确保连接结果是有效的ASCII协议缓冲区,可以使用TextFormat进行解析。
请注意,这可能会有一些性能影响(因为解析ASCII表示可能很昂贵)。 但是,这样可以省去用其他语言编写转换器的麻烦,因此它似乎是一种方便的解决方案。
我不会自己解析C源代码,而是使用LibClang将C文件解析为AST和我自己的AST walker,以根据需要生成Protobuf和转码器。 谷歌搜索“libclang walk AST”应该给出一些东西,比如来自这个github存储库的 ast-walker.cc
和ast-dumper.cc
。
以上就是c/c++开发分享C结构(C ++ POD)和谷歌protobufs之间的转换?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562757.html