Я обертываю библиотеку с помощью 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
в порядке?