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

Posted

技术标签:

【中文标题】SWIG 不扩展嵌套宏“错误:输入中的语法错误 (3)”【英文标题】:SWIG does not expand nested macros "Error: Syntax error in input(3)" 【发布时间】:2015-02-02 11:07:13 【问题描述】:

我有一个定义嵌套宏的 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 预处理器不是完整的 C99 或 C++11。您可以改用%define 在您的界面中编写兼容的 SWIG 特定宏。我在***.com/a/27636034/168175 有另一个案例的示例,可能会有所帮助。 你解决过这个问题吗? :\ 很遗憾没有。 【参考方案1】:

要在 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

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

【讨论】:

以上是关于SWIG 不扩展嵌套宏“错误:输入中的语法错误 (3)”的主要内容,如果未能解决你的问题,请参考以下文章

带有模板类的 SWIG SHARED_PTR 宏

SWIG 3 中文手册——8. 预处理

辅助函数中的 swig 宏 $descriptor

SWIG 和 windows 导出宏

有没有一种方法可以将宏名称作为参数传递给嵌套宏,而不会在扩展最外层的宏时扩展它们?

带有 SWIG 未知长度数组的 NumPy C 扩展