我正在使用CFFI从Python调用一个返回结构的C函数。结构使用time_t
元素定义。如何将结构声明为CFFI,以便我可以从Python访问它?
例如,我尝试了以下方法(获取文件的修改时间):
import cffi
ffi = cffi.FFI()
ffi.cdef("""
// From POSIX
struct timespec {
time_t tv_sec;
long tv_nsec;
...;
};
struct stat {
struct timespec st_mtim;
...;
};
// From "man 2 lstat"
int lstat(const char *path, struct stat *buf);
""")
stat = ffi.verify("#include <sys/stat.h>")
这会出错:
cffi.api.CDefError: cannot parse " time_t tv_sec;"
:5: before: time_t
在注释掉time_t tv_sec;
行后会进行编译,但当然您无法访问tv_sec
字段。据推测,CFFI的C解析器不支持typedef。您不能只用实际类型替换time_t
,因为不同平台上的类型可能不同。
答案 0 :(得分:3)
我担心没有好的答案。您需要编写typedef long time_t;
或类似内容,假设time_t总是与大小相同。如果代码应该可以移植到time_t可能不同的平台,那么你需要单独获取大小:
ffi1 = cffi.FFI()
ffi1.cdef("""#define SIZE_OF_TIME_T ...""")
lib = ffi1.verify("""
#include <sys/types.h>
#define SIZE_OF_TIME_T sizeof(time_t)
""")
size_of_time_t = lib.SIZE_OF_TIME_T