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

SWIG does not expand nested macros "Error: Syntax error in input(3)"

本文关键字:in error input Syntax Error 扩展 嵌套 SWIG      更新时间:2023-10-16

我有一个定义嵌套宏的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 中定义的宏使用此问题中解释的技巧 在参数数上重载宏

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

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