Что такое предупреждение 503 от SWIG?

Пожалуйста, объясните, что это предупреждение от 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-коде SWIG в Android NDK.

Ответ 1

Java не имеет эквивалента 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, если вы хотите использовать их на целевом языке. См. здесь.

Ответ 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 & lt; int> ', если не переименован в действительный идентификатор

И вы не можете попытаться предвидеть переименование в вашем %template:

%template(MyIntFunction) my_function<int>;

Потому что тогда вы получите

error: Template 'myfunction' undefined.

Что очень расстраивает, если вы применяете глобальные правила переименования, и вам действительно нужно "игнорировать переименование" только для нескольких вещей. В отличие от типографских карт, директивы переименования живут всегда. Было бы неплохо иметь возможность отключить их даже временно.

Единственный обходной путь, к которому я пришел, - это вернуться к %rename и обновить его, чтобы явно соответствовать (или, скорее, не совпадать) функциям шаблона, которые вы объявили встроенными. Вот так:

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

Это не идеально, но это обходной путь.

(Все это было сделано в SWIG 4.0)