3

我正在使用 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为实际类型,因为不同平台上的类型可能不同。

4

1 回答 1

3

我担心没有好的答案。您需要编写typedef long time_t;或类似的,假设 time_t 的大小始终与 long 相同。如果代码应该可移植到 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
于 2013-10-14T08:19:16.853 回答