Что такое предупреждение 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)