Mam plik nagłówkowy jak
#include <MyUtils.h> // defines namespace MyUtils, and MyUtils::Math
namespace mum=MyUtils::Math;
class LocalClass{
public:
void eat( const mum::array& arr);
};
Mam to co zwykle %{ #include %}, %include
struktura w moim .i
plik.
Kiedy uruchamiam swig, otrzymuję:
Error: Unknown namespace "MyUtils::Math"
Jak / dlaczego SWIG nie wie o aliasingu przestrzeni nazw? Czy istnieje coś innego niż używanie #ifndef SWIG
makra preprocesora? (por. ta dyskusja (Muszę zachować mój kod c ++ niezależny od swig)
Wersja SWIG 2.0.4
Odpowiedzi:
2 dla odpowiedzi № 1Załóżmy, że mamy nagłówek
// MyUtils.h
namespace MyUtils {
namespace Math {
typedef int SomeType;
class array {
//
};
}
}
I kolejny nagłówek
// MyHeader.h
#include <MyUtils.h>
namespace mum=MyUtils::Math;
class LocalClass {
public:
void eat( const mum::array& arr);
};
Jeśli plik SWIG wygląda
// MySwigInterfaceFile.i
%module MySwigModule
#include "MyHeader.h
%include "MyHeader.h"
Wpadniesz w kłopoty, SWIG wygeneruje kod, którego nie można skompilować z wielu powodów
1) Musisz dołączyć wszystkie nagłówki, SWIG nie możerekurencyjny nagłówek, tj. musisz dołączyć MyUtils.h do MySwigInterfaceFile.i przed MyHeader.h, to samo dotyczy włączenia za pomocą dyrektywy% include
2) Musisz pisać używając przestrzeni nazw MyUtils :: Math; po włączeniach za pomocą #include
3) Aby SWIG był świadomy wszelkich typów czcionek w zagnieżdżonych przestrzeniach nazw, musisz napisać
namespace MyUtils {
namespace Math {
%typedef int SomeType;
}
}
przed inkluzjami używającymi% obejmują
Polecam programistom zacząć od wielu małych projektów, aby zdobyć praktyczne doświadczenie z SWIG.
0 dla odpowiedzi nr 2
SWIG wydaje się obsługiwać aliasing przestrzeni nazw. Myślę, że problem jest prawdopodobnie w MyUtils.h; być może istnieją definicje preprocesora, które należy ustawić, aby używał przestrzeni nazw. Możesz je zdefiniować w wierszu poleceń SWIG.