[英]How do I pass a pointer to a C function with Python's CFFI?
如何使用Python的CFFI将指针传递给C函数?
例如,如果我正在包装的库有两个功能:
void some_function(void (*callback)()) {
callback();
}
void some_callback() {
printf("callback!\n");
}
如何在some_callback
调用some_function
? 例如,类似于:
from mylib._ffi import lib
lib.some_function(lib.some_callback)
我知道我可以使用ffi.callback(…)
在回调中包装Python函数,但我想知道是否可以避免重复类型签名和C函数等等。
使用最新版本的cffi,在外联模式下,您可以执行以下操作:
lib.some_function(ffi.addressof(lib, "some_callback"))
或者,这也适用于较旧的cffi,你需要调整cdef以包含“some_callback”作为常量函数指针而不是函数:
ffi.cdef("void (*const some_callback)();")
lib.some_function(lib.some_callback)
如果这看起来太神奇了,那么更详细但更清晰的解决方案是:
ffi.cdef("""
typedef void (*my_callback_t)();
my_callback_t get_some_callback(void);
""")
ffi.set_source("example", # <- or, ffi.verify(
"""
// declare get_some_callback() explicitly here:
typedef void (*my_callback_t)();
static my_callback_t get_some_callback(void) {
return &some_callback;
}
""")
some_callback = lib.get_some_callback()
lib.some_function(some_callback)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.