Условный `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
Другие вопросы по тегам