condizionale `ctypedef` con Cython
Domanda
Ho bisogno di accedere al typedef uint64_t
da stdint.h
in qualche codice wrapper che sto scrivendo e non riesco a capire come farlo fare. Il problema è che da quello che posso dire dalla documentazione, la mia ctypedef
dovrà assumere la forma:
ctypedef unsigned long uint64_t
o
ctypedef unsigned long long uint64_t
a seconda se WORDSIZE
da bits/wordsize.h
è 64 o 32. Non sono stato in grado di scoprire il modo per avere accesso a questa definizione preprocessore da Cython e se potessi, Cython non sembra come dichiarazioni ctypedef
in if
dichiarazioni e quando provo a mettere una dichiarazione if
in un blocco cdef
, sembra confondere con una dichiarazione. Qualche idea? Speriamo che mi manca solo qualcosa di veramente fondamentale qui.
Soluzione
cdef extern from "stdint.h":
ctypedef unsigned long long uint64_t
Qualsiasi ctypedef
che è extern
'd non avrà un typedef generato nel file .c. Cython includerà stdint.h
e il compilatore C utilizzerà il typedef reale da lì.
L'unica cosa che il tipo previsto per questioni è quando Cython genera il codice che converte automaticamente tra i tipi C e tipi di Python. Utilizzando mezzi unsigned long long
che Cython utilizzerà PyLong_FromUnsignedLongLong
e PyLong_AsLongLongAndOverflow
. In questo modo, si spera non sarà possibile ottenere alcun troncamento sulla conversione.
Altri suggerimenti
Cython comprende queste definizioni nel modulo libc.stdint
già:
from libc cimport stdint
ctypedef stdint.uint64_t foo