我用SWIG包装一个库(Python作为目标)。库函数包含数据类型为“uint32_t”,“uint8_t”等的参数。我想尽可能创建跨平台的接口,因此我想在interface.i
文件中使用原始函数签名。例如:
uint32_t func(uint32_t a, uint32_t b);
我试图解决的问题是,除非typedef
数据类型上有uint32_t
,否则SWIG不会将参数识别为整数。现在我在接口文件上使用它:
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).
由于SWIG不是一个功能齐全的编译器,因此无法完全评估该标头上的所有#ifdef
。
如何使用编译器在stdint.h
标题上选择的数据类型正确提供SWIG?事实上,严格执行正确的数据类型是否有意义,或仅typedef
intX_t
到long
是否正常?
答案 0 :(得分:12)
如果要在SWIG界面文件中使用这些类型,可以执行以下操作:
%module test
%include "stdint.i"
uint32_t my_function();
现有的SWIG界面对您的系统具有正确的typedef
。
答案 1 :(得分:0)
你应该强制使用typedef,因为uint32_t不是跨平台而不是交叉编译器。 uint32_t是C99标准,但许多编译器决定不完全实现这个标准。 您可以使用include以交叉编译器的方式重新定义项目类型:
http://www.azillionmonkeys.com/qed/pstdint.h
值得阅读上面链接的标题的介绍。您可以使用此include而不是stdint.h。
你也可以阅读这个问题: