提取C结构的字段

时间:2010-01-12 16:08:32

标签: python c language-agnostic struct

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

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

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

7 个答案:

答案 0 :(得分:10)

如果使用调试(-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语言要好得多。

答案 1 :(得分:5)

正则表达式在大约90%的时间内都会起作用,然后对剩下的10%会产生无穷无尽的麻烦。

在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,由你决定)。

答案 2 :(得分:3)

查看可为您生成界面代码或使用SwigSIPctypes

答案 3 :(得分:2)

你看过Swig吗?

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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