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

时间:2015-04-02 01:27:53

标签: c swig

我正在尝试使用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变量不兼容;这个有什么问题?

1 个答案:

答案 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