Kam*_*iel 10 python enums ctypes
我有一个我通过ctypes访问的结构:
struct attrl {
char *name;
char *resource;
char *value;
struct attrl *next;
enum batch_op op;
};
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有Python代码,如:
# struct attropl
class attropl(Structure):
pass
attrl._fields_ = [
("next", POINTER(attropl)),
("name", c_char_p),
("resource", c_char_p),
("value", c_char_p),
Run Code Online (Sandbox Code Playgroud)
但是我不知道该用什么用于batch_op
枚举.我应该把它映射到一个c_int
或?
至少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;
}
Run Code Online (Sandbox Code Playgroud)
和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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14398 次 |
最近记录: |