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 .