SWIG封装C项目遇typedef非常量长度数组报错 不修改头文件如何解决
问题原因
SWIG 4.0.2的语法解析器无法直接解析以sizeof计算结果作为定长的数组类型定义。你头文件中的SEPARATOR_SIZE宏展开后为(int)sizeof("-"),SWIG在解析typedef char SEPARATOR_ARRAY [SEPARATOR_SIZE];时无法识别这个动态计算的长度值,因此抛出语法错误。
解决方案(无需修改原头文件)
所有修改仅需在.i接口文件中完成,不影响原生C代码逻辑。
方案1:提前声明宏值(推荐,适用需要保留SEPARATOR_ARRAY类型的场景)
在引入头文件前,给SWIG显式指定SEPARATOR_SIZE的固定值即可,实际C代码编译时仍会使用原头文件的宏定义,不会出现值不一致问题:
%module test %{ #include "test.h" %} // 显式给SWIG声明宏的数值,和原头文件计算结果保持一致即可,这里"-"的sizeof为2 #define SEPARATOR_SIZE 2 %include "test.h"
方案2:忽略问题类型定义(适用不需要在Python侧使用SEPARATOR_ARRAY的场景)
如果你的Python封装不需要用到SEPARATOR_ARRAY类型,直接忽略该定义即可:
%module test %{ #include "test.h" %} %ignore SEPARATOR_ARRAY; %include "test.h"
方案3:手动声明数组类型(适用不想硬编码宏值且需要使用该类型的场景)
借助SWIG内置的carrays模块手动定义数组类型,替代头文件的解析逻辑:
%module test %include "carrays.i" %{ #include "test.h" %} %ignore SEPARATOR_ARRAY; %include "test.h" // 手动定义char数组操作接口 %array_class(char, SEPARATOR_ARRAY);
内容的提问来源于stack exchange,提问作者Tomasz Chrost
相关产品推荐
相关产品推荐

