2010-08-23 4 views
6

J'ai besoin d'accéder au typedef uint64_t de stdint.h dans un code d'emballage que j'écris et je n'arrive pas à comprendre comment le faire. Le problème est que de ce que je peux dire à partir des documents, mon ctypedef devra prendre la forme:'ctypedef' conditionnel avec Cython

ctypedef unsigned long uint64_t 

ou

ctypedef unsigned long long uint64_t 

selon le cas WORDSIZE de bits/wordsize.h est 64 ou 32. Je havre de paix J'ai été capable de trouver comment accéder à cette définition de préprocesseur à partir de Cython et si je le pouvais, Cython ne semble pas aimer les instructions ctypedef dans les instructions if et quand j'essaie de mettre une instruction if dans un bloc cdef, il semble le confondre esprit h une déclaration. Des idées? J'espère que je manque juste quelque chose de vraiment basique ici.

Répondre

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

Tout ctypedef qui est extern « d aura pas un typedef généré dans le fichier .c. Cython inclura stdint.h et votre compilateur C utilisera le typedef réel à partir de là. La seule chose que le type fourni est important est quand Cython génère du code qui convertit automatiquement entre les types C et les types Python. L'utilisation de unsigned long long signifie que Cython utilisera PyLong_FromUnsignedLongLong et PyLong_AsLongLongAndOverflow. De cette façon, vous n'obtiendrez pas de troncature lors de la conversion.

+0

parfait. C'est exactement ce que j'utilisais en attendant. Je n'ai pas besoin de changer quoi que ce soit. Il aurait probablement dû me venir à l'esprit de vérifier le fichier C généré maintenant que je pense à ce sujet. – aaronasterling

5

Cython comprend ces définitions dans le module libc.stdint déjà:

from libc cimport stdint 

ctypedef stdint.uint64_t foo