在ctypes.Structure中使用枚举

问题描述 投票:0回答:2

我有一个通过 ctypes 访问的结构:

struct attrl {
   char   *name;
   char   *resource;
   char   *value;
   struct attrl *next;
   enum batch_op op;
};

到目前为止我的Python代码如下:

# struct attropl
class attropl(Structure):
    pass
attrl._fields_ = [
        ("next", POINTER(attropl)),
        ("name", c_char_p),
        ("resource", c_char_p),
        ("value", c_char_p),

但我不确定

batch_op
枚举使用什么。我应该将其映射到
c_int
还是?

python enums ctypes
2个回答
14
投票

至少对于 GCC 来说

enum
只是一个简单的数字类型。它可以是 8 位、16 位、32 位、64 位或其他位(我已经使用 64 位值对其进行了测试)以及
signed
unsigned
。我想它不能超过
long long int
,但实际上你应该检查你的
enum
的范围并选择像
c_uint
这样的东西。

这是一个例子。 C 程序:

enum batch_op {
    OP1 = 2,
    OP2 = 3,
    OP3 = -1,
};

struct attrl {
    char *name;
    struct attrl *next;
    enum batch_op op;
};

void f(struct attrl *x) {
    x->op = OP3;
}

Python 的:

from ctypes import (Structure, c_char_p, c_uint, c_int,
    POINTER, CDLL)

class AttrList(Structure): pass
AttrList._fields_ = [
    ('name', c_char_p),
    ('next', POINTER(AttrList)),
    ('op', c_int),
]

(OP1, OP2, OP3) = (2, 3, -1)

enum = CDLL('./libenum.so')
enum.f.argtypes = [POINTER(AttrList)]
enum.f.restype = None

a = AttrList(name=None, next=None, op=OP2)
assert a.op == OP2
enum.f(a)
assert a.op == OP3

5
投票

使用

c_int
c_uint
就可以了。或者,食谱中有一个枚举类的食谱

© www.soinside.com 2019 - 2024. All rights reserved.