繁体   English   中英

提取C结构的字段

[英]Extract the fields of a C struct

我经常要用其他语言编写与C结构交互的代码。 最典型的是,这涉及使用structctypes模块编写Python代码。

所以我将有一个完整的结构定义的.h文件,我必须手动读取它们并在我的Python代码中复制这些定义。 这是耗时且容易出错的,并且当它们经常变化时很难保持两个定义同步。

是否有任何语言的工具或库(不必是C或Python)可以获取.h文件并生成其结构及其字段的结构化列表? 我希望能够编写一个脚本来生成我在Python中自动生成我的结构定义,并且我不希望必须处理任意C代码来执行它。 正则表达式在大约90%的时间内都会起作用,然后对剩下的10%会产生无穷无尽的麻烦。

如果使用debugging( -g )编译C代码, paholegit )可以为您提供所使用的确切结构布局。

$ pahole /bin/dd
…
struct option {
        const char  *              name;                 /*     0     8 */
        int                        has_arg;              /*     8     4 */

        /* XXX 4 bytes hole, try to pack */

        int *                      flag;                 /*    16     8 */
        int                        val;                  /*    24     4 */

        /* size: 32, cachelines: 1, members: 4 */
        /* sum members: 24, holes: 1, sum holes: 4 */
        /* padding: 4 */
        /* last cacheline: 32 bytes */
};
…

解析比直接解析要好得多。

如果C代码包含您在编写正则表达式时没有想到的语法,则会出现令人头疼的问题。 然后你回过头来意识到C不能被正则表达式真正解析,生活变得不那么有趣。

试试它:定义你自己的简单格式,它允许比C更少的技巧,并从你的文件生成C头文件和Python接口代码:

define socketopts
    int16 port
    int32 ipv4address
    int32 flags

然后你可以轻松编写一些Python来将其转换为:

typedef struct {
    short port;
    int ipv4address;
    int flags;
} socketopts;

并且还发出一个Python类,它使用struct来打包/解压缩三个值(可能有两个是big-endian,另一个是native-endian,由你决定)。

看看为您生成接口代码或使用ctypes的 SwigSIP

你看过Swig吗?

我已经在相当大的项目中成功使用了GCCXML 您将获得C代码(包括结构)的XML表示,您可以使用一些简单的Python对其进行后处理。

ctypes- codegenctypeslib (我认为同样的事情)将通过使用GCCXML解析头文件来生成ctypes Structure定义(我相信其他事情,但我只尝试过结构)。 它不再受支持,但在某些情况下可能会起作用。

我的朋友为这个任务完成了C-parser,他和cog一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM