2010-08-23 12 views
6

Ich brauche Zugriff auf die uint64_t typedef von stdint.h in einigen Wrapper-Code, den ich schreibe und ich kann nicht herausfinden, wie man es erledigt. Das Problem ist, dass von dem, was ich von dem docs sagen kann, meine ctypedef wird das Formular nehmen:bedingte `ctypedef` mit Cython

ctypedef unsigned long uint64_t 

oder

ctypedef unsigned long long uint64_t 

je nachdem, ob WORDSIZE von bits/wordsize.h ist 64 oder 32. Ich haven Ich konnte nicht herausfinden, wie man Zugang zu dieser Präprozessor-Definition von Cython bekommen kann und wenn ich könnte, scheint Cython keine ctypedef Anweisungen in if Anweisungen zu haben, und wenn ich versuche, eine if Anweisung in einen cdef Block zu setzen scheint es zu verwechseln h eine Erklärung. Irgendwelche Ideen? Hoffentlich verpasse ich hier nur etwas wirklich Grundlegendes.

Antwort

9
cdef extern from "stdint.h": 
    ctypedef unsigned long long uint64_t 

Jede ctypedef die extern ‚ist d keinen typedef in der C-Datei erzeugt haben. Cython gehören stdint.h und Ihre C-Compiler die tatsächliche typedef von dort verwenden.

Das einzige, was der Typ Sachen vorgesehen ist, wenn Cython Code erzeugt, der zwischen C-Typen und Python Typen automatisch umwandelt. Mit unsigned long long bedeutet, dass Cython PyLong_FromUnsignedLongLong und PyLong_AsLongLongAndOverflow verwenden. Auf diese Weise erhalten Sie hoffentlich keine Kürzung bei der Konvertierung.

+0

perfekt. Genau das habe ich in der Zwischenzeit benutzt. Ich muss nichts ändern. Wahrscheinlich hätte fiel mir ein, das erzeugte C-Datei nun zu prüfen, ob ich darüber nachdenke. – aaronasterling

5

Cython umfasst diese Definitionen im Modul libc.stdint bereits:

from libc cimport stdint 

ctypedef stdint.uint64_t foo