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.

SWIG によって生成された C++ コードが Android NDK でコンパイルされると、警告が生成されます。

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' が未定義です。

グローバルな名前変更ルールを適用している場合、これは非常にイライラします。本当に「名前変更を無視」する必要があるのは、いくつかのことだけです。タイプマップとは異なり、名前変更ディレクティブは常に有効です。一時的であっても、それらをオフにできると便利です。

私が思いついた唯一の回避策は、 に戻って、%renameインラインで宣言したテンプレート関数にのみ一致するように (または一致しないように) 明示的に更新することです。そのようです:

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

完全ではありませんが、回避策です。

(これはすべて SWIG 4.0 で行われました)

于 2019-10-18T12:51:26.770 に答える