我有一个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
#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_
#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_
#include "MyClass.h"
MyClass::MyClass(std::string s) : fString(s)
{
}
%module MyClass
%{
#include "Util.h"
#include "MyClass.h"
%}
%include "Util.h"
%include "MyClass.h"
答案 0 :(得分: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__)
成为:
#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
我认为您的例子应该足够了。