代码之家  ›  专栏  ›  技术社区  ›  Eli Courtwright

提取C结构的字段

  •  14
  • Eli Courtwright  · 技术社区  · 16 年前

    我经常不得不用其他与C结构交互的语言编写代码。最典型的情况是使用 struct ctypes 模块。

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

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

    7 回复  |  直到 13 年前
        1
  •  10
  •   ephemient    13 年前

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

    $ 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更好地进行解析。

        2
  •  5
  •   Steve Jessop    16 年前

    正则表达式在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;
    

    还可以发出一个使用 struct 打包/解包三个值(可能有两个big endian和另一个本机endian,由您决定)。

        3
  •  3
  •   Gregory Pakosz    16 年前

    看一看 Swig SIP 它将为您或使用生成接口代码 ctypes .

        4
  •  2
  •   mmr    16 年前

    你看过吗 Swig ?

        5
  •  1
  •   elifiner    16 年前

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

        6
  •  1
  •   Sam Hartsfield    14 年前

    ctypes-codegen ctypeslib (我想也是一样)会产生ctypes Structure 定义(我相信还有其他东西,但我只尝试使用gcxml解析头文件)。它不再受支持,但在某些情况下可能会起作用。

        7
  •  0
  •   vitaly.v.ch    16 年前

    我的一个朋友完成了C-Parser任务,他使用了COG。