12

请解释 SWIG 的这些警告是什么以及如何避免它?

Warning 503: Can't wrap 'operator ()' unless renamed to a valid identifier.
Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
Warning 503: Can't wrap 'operator *' unless renamed to a valid identifier.

在 Android NDK 下编译 SWIG 生成的 C++ 代码时会生成警告。

4

3 回答 3

15

Java 没有与 C++ 等效operator()operator=相同的意义,因此 SWIG 无法直接包装它。因为它们可能很重要,所以您会看到一条警告,说明它们没有被包装。(有时失踪operator=可能特别糟糕)。

此代码在运行时会出现这样的警告swig -Wall -c++ -java

%module Sample

struct test {
  bool operator()();
};

但是您可以使警告静音并告诉 SWIG 将运算符直接公开为常规成员函数,方法是这样说:

%module Sample

%rename(something_else) operator();

struct test {
  bool operator()();
};

这会导致在生成的包装器something_else中添加一个名为的函数。operator()

或者您可以向 SWIG 断言忽略这些就可以了,使用:

%ignore operator()

(您也可以通过使用类名限定运算符来更广泛地应用这些指令中的任何一个)。

于 2012-04-24T11:33:58.943 回答
3

如果要在目标语言中使用重载运算符,则需要在 SWIG 中以特殊方式处理它们。见这里

于 2012-04-24T11:28:49.430 回答
1

如果您有一个出现在用于实例化函数的指令%rename之前的指令,您可能会遇到此警告,如下所示:%template

%module some_module
%rename("%(undercase)s", %$isfunction) ""; 
// equivalently  %rename("%(utitle)s", %$isfunction) "";

%inline %{
template<class T>
void MyFunction(){}
%}
// ...

%template(MyIntFunction) MyFunction<int>;

警告 503:除非重命名为有效标识符,否则无法包装 'my_function< int >'

而且您不能尝试在以下内容中预期重命名%template

%template(MyIntFunction) my_function<int>;

因为那样你会得到

错误:模板“myfunction”未定义。

Which is very frustrating if you're applying global renaming rules, and you really only need to "ignore renaming" for just a few things. Unlike typemaps, rename directives live for all-time. It'd be nice to be able to turn them off, even temporarily.

The only workaround for this I've come up with is to go back to the %rename and update it to explicitly only match (or rather, not match) the template functions you've declared inline. Like so:

// don't rename functions starting with "MyFunction"
%rename("%(undercase)s", %$isfunction, notregexmatch$name="^MyFunction") "";

It's not perfect, but it's a workaround.

(This was all done in SWIG 4.0)

于 2019-10-18T12:51:26.770 回答