9

我需要从我正在编写的一些包装代码中访问uint64_ttypedef,stdint.h但我不知道如何完成它。问题是,从我从文档中可以看出,我ctypedef必须采用以下形式:

ctypedef unsigned long uint64_t

或者

ctypedef unsigned long long uint64_t

取决于WORDSIZEfrombits/wordsize.h是 64 还是 32。我无法找出如何从 Cython 访问这个预处理器定义,如果可以的话,Cython 似乎不喜欢ctypedef语句中的if语句以及当我尝试放入块中的if语句cdef,似乎将其与声明混淆。有任何想法吗?希望我只是在这里遗漏了一些非常基本的东西。

4

2 回答 2

11
cdef extern from "stdint.h":
    ctypedef unsigned long long uint64_t

任何ctypedef' externd 都不会在 .c 文件中生成 typedef。Cython 将包含stdint.h并且您的 C 编译器将从那里使用实际的 typedef。

提供的类型唯一重要的是 cython 生成的代码会在 C 类型和 Python 类型之间自动转换。Usingunsigned long long表示 Cython 将使用PyLong_FromUnsignedLongLongand PyLong_AsLongLongAndOverflow。这样,您希望在转换时不会被截断。

于 2010-08-23T02:47:02.517 回答
10

Cythonlibc.stdint已经在模块中包含了这些定义:

from libc cimport stdint

ctypedef stdint.uint64_t foo
于 2016-02-16T04:12:26.923 回答