Eli*_*ght 14 c python language-agnostic struct
我经常要用其他语言编写与C结构交互的代码.最典型的是,这涉及使用struct或ctypes模块编写Python代码.
所以我将有一个完整的结构定义的.h文件,我必须手动读取它们并在我的Python代码中复制这些定义.这是耗时且容易出错的,并且当它们经常变化时很难保持两个定义同步.
是否有任何语言的工具或库(不必是C或Python)可以获取.h文件并生成其结构及其字段的结构化列表?我希望能够编写一个脚本来生成我在Python中自动生成我的结构定义,并且我不希望必须处理任意C代码来执行它.正则表达式在大约90%的时间内都会起作用,然后对剩下的10%会产生无穷无尽的麻烦.
eph*_*ent 10
如果使用debugging(-g)编译C代码,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 */
};
…
解析比直接解析要好得多.
正则表达式在大约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,由你决定).