我需要在我正在撰写的一些包装代码中访问uint64_t
来自stdint.h
的typedef,我无法弄清楚如何完成它。问题是,从我从文档中可以看出,我的ctypedef
必须采用以下形式:
ctypedef unsigned long uint64_t
或
ctypedef unsigned long long uint64_t
取决于来自WORDSIZE
的{{1}}是64还是32.我无法找到如何从Cython访问此预处理器定义,如果可以的话,Cython不会'似乎喜欢bits/wordsize.h
语句中的ctypedef
语句,当我尝试在if
块中放置if
语句时,似乎会将其与声明混淆。有任何想法吗?希望我在这里遗漏一些非常基本的东西。
答案 0 :(得分:10)
cdef extern from "stdint.h":
ctypedef unsigned long long uint64_t
任何ctypedef
的{{1}}都不会在.c文件中生成typedef。 Cython将包含extern
,您的C编译器将使用实际的typedef。
该类型提供的唯一问题是当cython生成自动在C类型和Python类型之间转换的代码时。使用stdint.h
表示Cython将使用unsigned long long
和PyLong_FromUnsignedLongLong
。这样,您希望不会在转换时获得任何截断。
答案 1 :(得分:6)
Cython已在模块libc.stdint
中包含这些定义:
from libc cimport stdint
ctypedef stdint.uint64_t foo