我尝试使用 SWIG Python 包装以下 header ,但收到错误:
Error: Syntax error in input(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 变量不兼容;这个有什么问题吗?
最佳答案
问题在于 SWIG 对标识符复杂性的处理。
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 确实接受了这个 header 。
如果无法选择 C++ 构建,您可以将 struct
重命名为其他名称(例如 Complex
)。
如果 header 定义不在您的控制之下,您可以对预处理器采取大锤方法,通过 #define
-ing complex
到可接受的替代方案改为名称,例如将以下内容放入您的 SWIG 模块接口(interface) .i 文件中:
#define complex Complex
%include "rmath.h" // Or whatever your header is called
当您构建生成的 SWIG C 包装文件时,您还需要在包含 rmath.h 之前提供相同的 #define
。 p>
关于c - C 结构声明中的 SWIG 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29403567/