c++ - SWIG 不扩展嵌套宏 "Error: Syntax error in input(3)"

标签 c++ swig

我有一个定义嵌套宏的 C++ 头文件。它可以用 Clang 或 GCC 编译,但 SIWG 无法正确解析它们。

我可以编译包含头文件的 MyClass.cc

$ g++ MyClass.cc -c -o MyClass.o

但是 SWIG 3.0.2 会生成以下错误。

$ swig -c++ -python MyClass.i   
MyClass.h:15: Error: Syntax error in input(3).

如何消除此错误? Util.h 中定义的宏使用此问题 Overloading Macro on Number of Arguments 中解释的技巧。

Util.h

#ifndef UTIL_H_
#define UTIL_H_

#define GET3(Name, Title, Type) \
  Type Get##Title() const { \
    return f##Name; \
  }
#define ARG_LEN_SWITCH(_1, _2, _3, NAME, ...) NAME
#define GET2(Name, Type) GET3(Name, Name, Type)
#define GET(...) ARG_LEN_SWITCH(__VA_ARGS__, GET3, GET2)(__VA_ARGS__)

#endif // UTIL_H_

MyClass.h

#ifndef MY_CLASS_H_
#define MY_CLASS_H_

#include <iostream>
#include <string>
#include "Util.h"

 class MyClass
{
 private:
  std::string fString;
 public:
  MyClass(std::string s);
  GET(String, std::string)
};

#endif // MY_CLASS_H_

MyClass.cc

#include "MyClass.h"

 MyClass::MyClass(std::string s) : fString(s)
{
}

MyClass.i

%module MyClass
%{
#include "Util.h"
#include "MyClass.h"
%}

%include "Util.h"
%include "MyClass.h"

最佳答案

要在 SWIG 中实现此功能,您必须使用 %define 而不是 #define。我不知道为什么,我从来没有成功地找到这个,例如

#define GET3(Name, Title, Type) \
  Type Get##Title() const { \
    return f##Name; \
  }
#define ARG_LEN_SWITCH(_1, _2, _3, NAME, ...) NAME
#define GET2(Name, Type) GET3(Name, Name, Type)
#define GET(...) ARG_LEN_SWITCH(__VA_ARGS__, GET3, GET2)(__VA_ARGS__)

变成:

#define GET3(Name, Title, Type) \
  Type Get##Title() const { \
    return f##Name; \
  }
#define ARG_LEN_SWITCH(_1, _2, _3, NAME, ...) NAME
#define GET2(Name, Type) GET3(Name, Name, Type)
%define GET(...)
    ARG_LEN_SWITCH(__VA_ARGS__, GET3, GET2)(__VA_ARGS__)
%enddef

我认为这对于您的示例来说应该足够了。

关于c++ - SWIG 不扩展嵌套宏 "Error: Syntax error in input(3)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28276374/

相关文章:

c++ - 在 C++11/14 中处理儒略日期

c++ - cmake + 痛饮 + 依赖项

python - Swig 和 Python - 不同的对象实例化

c++ - 在另一个类上使用的单例模式

c++ - 为 C++ chrono 重定向 newlib

python - SWIG、Python 和指针

c++ - Android、SWIG 和双向通信

python - 来自 python,创建数据 block 并通过 SWIG 将其指针传递给 c 程序

c++ - 将 boost::timer 结果存储在一个变量中

python - OpenCV - 检测矩形或五边形