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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top