2012-05-07 2 views
6

Я обертываю библиотеку с помощью SWIG (Python как цель). Библиотечные функции содержат параметры с типами данных «uint32_t», «uint8_t» и т. Д. Я хочу создать интерфейс как можно более кросс-платформенный, поэтому я хочу использовать оригинальные сигнатуры функций в файле interface.i. Например:Как создать кросс-платформенный интерфейс с SWIG?

uint32_t func(uint32_t a, uint32_t b); 

Проблема, которую я пытаюсь решить, что SWIG не распознает параметр как целое число, если не является typedef на uint32_t типа данных. Сейчас я использую это на файле интерфейса:

typedef unsigned uint32_t; 

Удаление что typedef линия будет вызывать функцию, чтобы не быть отозваны от цели связывания Python:

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

Предыдущая typedef будет ОК моя локальная машина, но может отличаться на другом компиляторе/платформе. Использование директивы %include "stdint.h" вызовет ошибку на SWIG:

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

Wich имеет смысл, так как SWIG не полнофункциональный компилятор, и не может в полной мере оценить все #ifdef на этом заголовке.

Как правильно передать SWIG с типами данных, которые компилятор выбирает на заголовке stdint.h? Имеет ли смысл иметь строгое соблюдение правильных типов данных или просто typedef Все intX_t до long в порядке?

ответ

11

Если вы хотите использовать эти типы в вашем файле интерфейса SWIG вы можете сделать что-то вроде:

%module test 
%include "stdint.i" 

uint32_t my_function(); 

Который является существующий SWIG интерфейс имеет правильную typedef s для вашей системы.

0

Вы должны заставить typedef, потому что uint32_t не является перекрестной платформой, а не кросс-компилятором. uint32_t является стандартом C99, но многие компиляторы решили не полностью реализовать этот стандарт. Вы можете иметь включаемые переопределить в перекрестном образом компилятор ваших типов проектов:

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

Стоит прочитать введение заголовка я связан выше. Вы можете использовать этот include вместо stdint.h.

Вы также можете прочитать этот вопрос:

Cross-platform primitive data types in C++

Смежные вопросы