我正在尝试使用SWIG Python包装以下标头,我收到错误:
错误:输入(1)中的语法错误。
此错误,至少根据构建语句,发生在struct complex
声明。
#ifndef _RMATH_H
#define _RMATH_H
#ifndef _COMPLEX
struct complex { // error happens here
float x,y;
};
#define cabs(a) sqrt((a.x*a.x)+(a.y*a.y))
#endif
#endif
我知道SWIG与某些C变量不兼容;这个有什么问题?
答案 0 :(得分:2)
问题是SWIG处理标识符complex
。
SWIG不会调用外部C编译器来解析头文件;它有自己的C和C ++解析器。 C99 introduces support for complex numbers。 SWIG正在尝试支持C复数,但是将complex
视为关键字,这与在C中处理complex
的方式不同(它是complex.h中定义的宏)。
在SWIG实现的深度中,可以看出SWIG解析器将complex
作为关键字的处理仅适用于C模式,而不适用于C ++模式(注意cparse_cplusplus
变量是选中):
if (!cparse_cplusplus && (strcmp(c, "float complex") == 0)) return T_FLTCPLX; if (!cparse_cplusplus && (strcmp(c, "double complex") == 0)) return T_DBLCPLX; if (!cparse_cplusplus && (strcmp(c, "complex") == 0)) return T_COMPLEX;
当使用-c++
参数运行时,SWIG确实接受了此标头。
如果无法构建为C ++,您可以将struct
重命名为其他内容(例如Complex
)。
如果标题定义不在您的控制范围内,您可以使用预处理器的大锤方法,#define
- complex
替换为可接受的替代名称,例如,将以下内容放在SWIG模块界面 .i 文件中:
#define complex Complex
%include "rmath.h" // Or whatever your header is called
当您构建生成的SWIG C包装文件时,您还需要在包含 rmath.h 之前存在相同的#define
。