3

CFFI を使用して、構造体を返す Python から C 関数を呼び出しています。構造体は要素で定義されtime_tます。Python からアクセスできるように、構造体を CFFI に宣言するにはどうすればよいですか?

たとえば、次のことを試しました(ファイルの変更時刻を取得するため):

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 に答える