【问题标题】:What is Warning 503 by SWIG?SWIG 的 503 警告是什么?
【发布时间】:2012-04-24 11:26:06
【问题描述】:

请解释 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.

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

【问题讨论】:

  • 这不是 G++ 警告,而是 SWIG 警告。
  • 我想说这看起来更像 SWIG。除非您想使用 Java 中的这些运算符,否则这不是问题。
  • 感谢您的信息,我已经编辑了我的问题。

标签: c++ android-ndk swig gcc-warning


【解决方案1】:

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()

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您有一个 %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'

      而且您不能尝试在您的%template 中预期重命名:

      %template(MyIntFunction) my_function<int>;
      

      因为那样你会得到

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

      如果您要应用全局重命名规则,这将非常令人沮丧,而您实际上只需要“忽略重命名”几件事。与类型映射不同,重命名指令永远存在。能够关闭它们会很好,即使是暂时的。

      我想出的唯一解决方法是返回%rename 并将其更新为仅显式匹配(或者更确切地说,不匹配)您已在内联声明的模板函数。像这样:

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

      这并不完美,但它是一种解决方法。

      (这一切都在 SWIG 4.0 中完成)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 2019-09-02
        • 2013-08-18
        • 1970-01-01
        • 2022-06-26
        相关资源
        最近更新 更多