python - 有条件的 `ctypedef` 与 Cython

标签 python c cython

我需要在我正在编写的一些包装代码中访问 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

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

提供的类型唯一重要的是当 cython 生成自动在 C 类型和 Python 类型之间转换的代码时。使用 unsigned long long 意味着 Cython 将使用 PyLong_FromUnsignedLongLongPyLong_AsLongLongAndOverflow。这样,您有望不会在转换时出现任何截断。

关于python - 有条件的 `ctypedef` 与 Cython,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3544240/

相关文章:

c++ - 在 Python 中公开 C++ 全局变量

Python:如何合并列表以创建嵌套列表

python - 如何在人员列表中找到不同国家的数量?

python - 我正在创建无损 PNG 图像吗?

c - 使用 fgets 进行段错误,即使 fopen 在 C 中不返回 NULL

c - 使用 strtok 两次将一行分成 "words"并将 "words"分成更小的单词?

c++11 - Cython:避免通过 std::move 复制不起作用

python - time.time() 无法在 Cython 中运行 while 循环预定时间

python - 如何在 python 中连接列表,但如果元素相等,则只保留相邻列表的最后一个或第一个元素

C 与微 Controller : starting address of struct to be a specific address?