如何将C头转换为Python ctypes代码?

问题描述:

下面如何将C头转换为Python ctypes代码?

typedef struct _node_t { 
int value; 
struct _node_t* next; 
} node_t; 

的c头可译为像的下方。

class node_t(Structure): 
    pass 

node_t._fields_ = [ 
     ('value', ctypes.c_int), 
     ('next', POINTER(node_t)) 
] 

但是,我不能翻译带有void和回调函数的c-header代码。 我应该如何将下面的c-header翻译成Python c型代码?

class PacketHandlerDelegate_D(Structure): 
pass 

PacketHandlerDelegate_D._fields_ = [ 
    // Delegate object 
    void *delegate; 

    // Callback functions 
    void (*addSampleToA)(void *delegate, int sample1, int sample2); 
    void (*addSampleToB)(void *delegate, unsigned short int signalfast, unsigned short int signalSlow); 
    void (*addSampleToC)(void *delegate, char x, char y, char z); 
    void (*addSampleToD)(void *delegate, unsigned short int sample); 
    void (*addSampleToE)(void *delegate, short int sample); 

]

阅读的文档,可以通过CFUNCTYPE生成函数的指针的类型。退货类型voidNone表示。可以使用c_void_p作为空指针。

因此,例如:

ADD_SAMPLE_TO_B_TYPE = CFUNCTYPE(None, c_void_p, c_ushort, c_ushort) 

... 

PacketHandlerDelegate_D._fields_ = [ 
    ... 
    (addSampleToB, ADD_SAMPLE_TO_B_TYPE), 
    ... 
] 

P.S.由于您在PacketHandlerDelegate_D中没有递归声明,所以您可以在类体中定义这些声明:

class PacketHandlerDelegate_D(Structure): 
    ... 
    addSampleToB = ADD_SAMPLE_TO_B_TYPE 
    ...