用Cython条件`ctypedef`

时间:2010-08-23 01:44:15

标签: python c cython

我需要在我正在撰写的一些包装代码中访问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语句时,似乎会将其与声明混淆。有任何想法吗?希望我在这里遗漏一些非常基本的东西。

2 个答案:

答案 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 longPyLong_FromUnsignedLongLong。这样,您希望不会在转换时获得任何截断。

答案 1 :(得分:6)

Cython已在模块libc.stdint中包含这些定义:

from libc cimport stdint

ctypedef stdint.uint64_t foo