SWIG不展开嵌套宏“错误:输入(3)中的语法错误”

Aki*_*ura 7 c++ swig

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

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

$ g++ MyClass.cc -c -o MyClass.o
Run Code Online (Sandbox Code Playgroud)

但是SWIG 3.0.2产生以下错误。

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

如何清除此错误?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_
Run Code Online (Sandbox Code Playgroud)

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_
Run Code Online (Sandbox Code Playgroud)

MyClass.cc

#include "MyClass.h"

 MyClass::MyClass(std::string s) : fString(s)
{
}
Run Code Online (Sandbox Code Playgroud)

MyClass.i

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

%include "Util.h"
%include "MyClass.h"
Run Code Online (Sandbox Code Playgroud)

Fle*_*exo 0

要在 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__)
Run Code Online (Sandbox Code Playgroud)

变成:

#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
Run Code Online (Sandbox Code Playgroud)

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