标签:struct typedef c-3 python python-cffi
我正在使用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替换为实际类型,因为不同平台上的类型可能不同.
解决方法:
我担心没有好的答案.您需要编写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
标签:struct,typedef,c-3,python,python-cffi 来源: https://codeday.me/bug/20191122/2061365.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。