c - C 结构声明中的 SWIG 语法错误

标签 c swig

我尝试使用 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/

相关文章:

c - 使用Cython作为C包装器

c - 合并排序的实现不起作用?

c - 如何在getopt_long中使用no_argument?

java - SWIG (v1.3.29) 生成的 C++ 到 Java Vector 类无法正常运行

c - 十六进制打印中的零跳过

c - WIFSTOPPED 无法正常工作

SWIG:自定义类的对象作为输出参数(使用 Python)

python - OS X El Capitan 上的 dlopen 错误 "unsafe use of relative rpath"

c++ - Swig -includeall 除了...

python - 混合 C++ 和 Python 的项目的目录结构