2010-08-23 8 views
6

Potrzebuję dostępu do uint64_t typedef od stdint.h w jakimś opakowaniu, które piszę i nie mogę wymyślić, jak to zrobić. Problemem jest to, że z tego co mogę powiedzieć z docs, mój ctypedef będzie musiał przybrać formę:warunkowe `ctypedef` z Cythonem

ctypedef unsigned long uint64_t 

lub

ctypedef unsigned long long uint64_t 

zależności czy WORDSIZE z bits/wordsize.h jest 64 lub 32. I haven "Byłem w stanie dowiedzieć się, jak uzyskać dostęp do tej wstępnej definicji z Cython i jeśli mógłbym, Cython wydaje się nie lubić oświadczeń ctypedef w oświadczeniach if i kiedy próbuję umieścić oświadczenie if w bloku cdef, wydaje się mylić to z dowcipem h deklaracji. Jakieś pomysły? Mam nadzieję, że brakuje mi czegoś naprawdę podstawowego.

Odpowiedz

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

Wszelkie ctypedef to extern byłyby nie będzie mieć typedef wygenerowane w pliku .c. Cython będzie zawierał stdint.h, a twój kompilator C użyje aktualnego typedef z tego miejsca.

Jedyną rzeczą, której dotyczy dany typ, jest generowanie kodu, który automatycznie konwertuje pomiędzy typami C i typami Python. Używanie unsigned long long oznacza, że ​​Cython użyje PyLong_FromUnsignedLongLong i PyLong_AsLongLongAndOverflow. W ten sposób, miejmy nadzieję, nie otrzymasz żadnego skrócenia konwersji.

+0

Perfect. Właśnie tego używałem w międzyczasie. Nie muszę niczego zmieniać. Prawdopodobnie powinienem był pomyśleć o sprawdzeniu wygenerowanego pliku C teraz, gdy o tym myślę. – aaronasterling

5

Cython obejmuje tych definicji w module libc.stdint już:

from libc cimport stdint 

ctypedef stdint.uint64_t foo