使用Cython的条件`ctypedef`

9 投票
2 回答
3238 浏览
提问于 2025-04-16 03:09

我需要在我写的一个包装代码中使用来自 stdint.huint64_t 类型,但我不知道该怎么做。根据我查阅的文档,我的 ctypedef 需要写成以下两种形式之一:

ctypedef unsigned long uint64_t

或者

ctypedef unsigned long long uint64_t

这取决于 bits/wordsize.h 中的 WORDSIZE 是 64 还是 32。我一直找不到如何在 Cython 中访问这个预处理器定义的方法,而且就算能找到,Cython 似乎也不喜欢在 if 语句中使用 ctypedef,当我试图在 cdef 块中放一个 if 语句时,它似乎把它搞混了,认为这是一个声明。有没有什么想法?希望我只是遗漏了一些非常基础的东西。

2 个回答

10

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

from libc cimport stdint

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

任何被标记为 externctypedef 在生成的 .c 文件中不会有 typedef。这意味着 Cython 会包含 stdint.h,然后你的 C 编译器会直接使用那里的实际 typedef。

提供的类型主要是在 Cython 生成代码时用来自动转换 C 类型和 Python 类型。比如,使用 unsigned long long 就意味着 Cython 会用 PyLong_FromUnsignedLongLongPyLong_AsLongLongAndOverflow 这两个函数。这样做的好处是,希望在转换时不会出现数据丢失的问题。

撰写回答