C 结构声明中的 SWIG 语法错误
SWIG syntax error in C struct declaration
我正在尝试使用 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 对标识符的处理 complex
。
SWIG 不会调用外部 C 编译器来解析 header 文件;它有自己的 C 和 C++ 解析器。 C99 introduces support for complex numbers. SWIG is attempting to support C complex numbers, but is treating complex
as a keyword, which is different from how complex
is treated in C (where it is a macro defined in 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++
参数时,这个 header 确实被 SWIG 接受。
如果无法选择构建为 C++,您可以将 struct
重命名为其他名称(例如 Complex
)。
如果 header 定义不受您的控制,您可以使用 pre-processor 采取大锤方法,通过 #define
-ing complex
到可接受的替代名称,例如将以下内容放入您的 SWIG 模块接口 .i 文件中:
#define complex Complex
%include "rmath.h" // Or whatever your header is called
当您构建生成的 SWIG C 包装器文件时,在包含 rmath.h 之前,您还需要具有相同的 #define
.
我正在尝试使用 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 对标识符的处理 complex
。
SWIG 不会调用外部 C 编译器来解析 header 文件;它有自己的 C 和 C++ 解析器。 C99 introduces support for complex numbers. SWIG is attempting to support C complex numbers, but is treating complex
as a keyword, which is different from how complex
is treated in C (where it is a macro defined in 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++
参数时,这个 header 确实被 SWIG 接受。
如果无法选择构建为 C++,您可以将 struct
重命名为其他名称(例如 Complex
)。
如果 header 定义不受您的控制,您可以使用 pre-processor 采取大锤方法,通过 #define
-ing complex
到可接受的替代名称,例如将以下内容放入您的 SWIG 模块接口 .i 文件中:
#define complex Complex
%include "rmath.h" // Or whatever your header is called
当您构建生成的 SWIG C 包装器文件时,在包含 rmath.h 之前,您还需要具有相同的 #define
.