2010-08-23 23 views
6

Necesito acceso a uint64_t typedef desde stdint.h en algún código de contenedor que estoy escribiendo y no puedo encontrar la manera de hacerlo. El problema es que de lo que puedo decir de los documentos, mi ctypedef tendrá que tomar la forma:condicional `ctypedef` con Cython

ctypedef unsigned long uint64_t 

o

ctypedef unsigned long long uint64_t 

dependiendo de si WORDSIZE de bits/wordsize.h es 64 o 32. No he 'Pude averiguar cómo obtener acceso a esta definición de preprocesador de Cython y, si pudiera, a Cython no parece gustarle las declaraciones en las declaraciones if y cuando intento poner una declaración if en un bloque cdef, parece confundirlo con ingenio h una declaración. ¿Algunas ideas? Espero que me esté perdiendo algo realmente básico aquí.

Respuesta

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

Cualquier ctypedef que es extern 'd no tendrá un typedef generado en el archivo .c. Cython incluirá stdint.h y su compilador C usará el typedef real desde allí.

Lo único que el tipo proporcionado importa es cuando cython genera código que convierte automáticamente entre tipos C y tipos Python. Usar unsigned long long significa que Cython usará PyLong_FromUnsignedLongLong y PyLong_AsLongLongAndOverflow. De esta forma, con suerte no obtendrás ningún truncamiento en la conversión.

+0

perfecto. Eso es exactamente lo que estaba usando mientras tanto. No tengo que cambiar nada. Probablemente se me debería haber ocurrido verificar el archivo C generado ahora que lo pienso. – aaronasterling

5

Cython incluye estas definiciones en el módulo ya libc.stdint:

from libc cimport stdint 

ctypedef stdint.uint64_t foo