Условный `ctypedef` с Cython
Мне нужен доступ к uint64_t
typedef от stdint.h
в некотором коде обертки, который я пишу, и я не могу понять, как это сделать. Проблема в том, что из того, что я могу сказать из документов, мой ctypedef
придется принять форму:
ctypedef unsigned long uint64_t
или же
ctypedef unsigned long long uint64_t
в зависимости от того, если WORDSIZE
от bits/wordsize.h
64 или 32. Мне не удалось выяснить, как получить доступ к этому определению препроцессора из Cython, и, если бы я мог, Cython, похоже, не нравится ctypedef
заявления в if
заявления и когда я пытаюсь поставить if
заявление в cdef
блок, кажется, путать его с объявлением. Есть идеи? Надеюсь, я просто упускаю что-то действительно простое здесь.
2 ответа
cdef extern from "stdint.h":
ctypedef unsigned long long uint64_t
любой ctypedef
это extern
не будет сгенерирована typedef в файле.c. Cython будет включать stdint.h
и ваш компилятор C будет использовать фактическую typedef оттуда.
Единственное, для чего имеет значение предоставленный тип, это когда cython генерирует код, который автоматически конвертирует между типами C и Python. С помощью unsigned long long
означает, что Cython будет использовать PyLong_FromUnsignedLongLong
а также PyLong_AsLongLongAndOverflow
, Таким образом, вы, надеюсь, не получите никакого усечения при конвертации.
Cython включает эти определения в модуль libc.stdint
уже:
from libc cimport stdint
ctypedef stdint.uint64_t foo