условный `ctypedef` с Cython - PullRequest
       4

условный `ctypedef` с Cython

7 голосов
/ 23 августа 2010

Мне нужен доступ к 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 ]

10 голосов
/ 23 августа 2010
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.Таким образом, вы, надеюсь, не получите никакого усечения при конвертации.

6 голосов
/ 16 февраля 2016

Cython включает эти определения в модуль libc.stdint уже:

from libc cimport stdint

ctypedef stdint.uint64_t foo
...