我需要在我正在编写的一些包装代码中访问 stdint.h
中的 uint64_t
typedef,但我不知道如何完成它。问题是,据我从文档中可以看出,我的 ctypedef
必须采用以下形式:
ctypedef unsigned long uint64_t
或
ctypedef unsigned long long uint64_t
取决于 bits/wordsize.h
中的 WORDSIZE
是 64 还是 32。我一直没能找到如何访问这个预处理器定义来自 Cython,如果可以的话,Cython 似乎不喜欢 if
语句中的 ctypedef
语句,当我尝试将 if
语句放入cdef
block ,它似乎将它与声明混淆了。有任何想法吗?希望我只是在这里遗漏了一些非常基本的东西。
最佳答案
cdef extern from "stdint.h":
ctypedef unsigned long long uint64_t
任何 extern
的 ctypedef
都不会在 .c 文件中生成 typedef。 Cython 将包含 stdint.h
,您的 C 编译器将使用那里的实际 typedef。
提供的类型唯一重要的是当 cython 生成自动在 C 类型和 Python 类型之间转换的代码时。使用 unsigned long long
意味着 Cython 将使用 PyLong_FromUnsignedLongLong
和 PyLong_AsLongLongAndOverflow
。这样,您有望不会在转换时出现任何截断。
关于python - 有条件的 `ctypedef` 与 Cython,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3544240/