2012-05-07 16 views
6

estoy envolviendo una biblioteca con TRAGO (Python como objetivo). Las funciones de la biblioteca contiene los parámetros con los tipos de datos "uint32_t", "uint8_t", etc. Quiero crear la interfaz como multiplataforma como sea posible, así que quieren utilizar las firmas función original en mi archivo interface.i. Por ejemplo:¿Cómo generar una interfaz multiplataforma con SWIG?

uint32_t func(uint32_t a, uint32_t b); 

El problema que estoy tratando de resolver es que el TRAGO no reconocerá el parámetro como un entero menos que haya una typedef en el uint32_t tipo de datos. En este momento estoy usando esto en el archivo de interfaz:

typedef unsigned uint32_t; 

Extracción que typedef línea hará que la función no ser exigible desde el destino de enlace de Python:

>>> mylib.func(2, 2) 
TypeError: in method 'func', argument 1 of type 'uint32_t' 

El anterior typedef está bien en mi máquina local, pero podría ser diferente en otro compilador/plataforma. Usando la directiva %include "stdint.h" generará un error en el TRAGO:

/usr/include/stdint.h:44: Error: Syntax error in input(1). 

Wich tiene sentido ya que el TRAGO no es un compilador con todas las funciones, y no se puede evaluar por completo toda la #ifdef en esa cabecera.

¿Cómo puedo alimentar correctamente TRAGO con los tipos de datos que el compilador es la elección de la cabecera stdint.h? De hecho tiene sentido para hacer cumplir estrictamente los tipos de datos correctos, o simplemente typedef Ing todo el intX_t-long está bien?

Respuesta

11

Si desea utilizar este tipo en el archivo de interfaz SWIG puede hacer algo como:

%module test 
%include "stdint.i" 

uint32_t my_function(); 

que es un TRAGO existente la interfaz tiene el typedef s correcto para su sistema.

0

Debe forzar typedef porque uint32_t no es multiplataforma y no compilador cruzado. uint32_t es estándar C99, pero muchos compiladores decidió no implementar completamente esta norma. Usted puede tener un include de redefinir de manera compilador cruzado sus tipos de proyectos:

http://www.azillionmonkeys.com/qed/pstdint.h

Vale la pena leer la introducción de la cabecera he vinculado anteriormente. Podría usar esto incluir en lugar de stdint.h.

También puede leer esta pregunta:

Cross-platform primitive data types in C++

Cuestiones relacionadas