用Cython条件`ctypedef`

aar*_*ing 7 c python cython

我需要uint64_tstdint.h我正在编写的一些包装代码中访问typedef ,我无法弄清楚如何完成它.问题是,从我从文档中可以看出,我ctypedef必须采取以下形式:

ctypedef unsigned long uint64_t
Run Code Online (Sandbox Code Playgroud)

要么

ctypedef unsigned long long uint64_t
Run Code Online (Sandbox Code Playgroud)

取决于是WORDSIZEbits/wordsize.h64还是32.我无法找到如何从Cython访问这个预处理器定义,如果可以的话,Cython似乎不喜欢ctypedef语句中的if语句,当我尝试放置时if在一个cdef块中的声明,它似乎与声明混淆.有任何想法吗?希望我在这里错过了一些非常基本的东西.

hab*_*bit 10

cdef extern from "stdint.h":
    ctypedef unsigned long long uint64_t
Run Code Online (Sandbox Code Playgroud)

任何ctypedef多数民众赞成extern"d不会有.c文件生成一个typedef.Cython将包括stdint.h,你的C编译器将使用实际的typedef.

该类型提供的唯一问题是当cython生成自动在C类型和Python类型之间转换的代码时.使用unsigned long longCython将使用的手段PyLong_FromUnsignedLongLongPyLong_AsLongLongAndOverflow.这样,您希望不会在转换时获得任何截断.


Ioa*_*dis 6

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

from libc cimport stdint

ctypedef stdint.uint64_t foo
Run Code Online (Sandbox Code Playgroud)