2012-04-03 14 views
2

Ich bin auf der Suche nach einer Möglichkeit zu erweitern (dh neue Mitglieder zu einem Typ mit der% extend-Direktive hinzufügen) ein Typ, der in der Bibliotheksdatei selbst definiert ist, während die Header-Dateien der Bibliothek stellt nur eine Vorwärtsdeklaration für den Typ bereit.erweitern 'unvollständige' Typen (SWIG)

Behandlung den Typs als ob seine Definition zum Zeitpunkt der Kompilierung bekannt ist, führt zu folgenden Warnung:

Warning 303: %extend defined for an undeclared class [name of the type]. 

Ist jemand bewusst eine Lösung oder eine Abhilfe für dieses Problem? Ich bin mir sicher, dass es einen gibt, da SWIGs Dokumentation besagt, dass swig davon ausgeht, dass der unbekannte Typ jedes Mal eine Struktur oder eine Union ist, wenn er einen findet.

Vielen Dank im Voraus!

+1

SWIG ist die Regexp von Interop. Jetzt hast du zwei Probleme. –

+1

@HansPassant stimme ich nicht zu. SWIG ist ein bisschen "schrullig", aber sobald Sie seine Eigenheiten verstehen, ist es sehr mächtig mit nützlichen Kapselung + Abstraktionen. – Flexo

Antwort

2

Sie können sehr einfach zusätzliche Methoden zu einem Typ hinzufügen, der in SWIG vorwärts deklariert wurde, indem Sie ihm eine leere Definition in der Schnittstelle geben, z.

test.h:

// Forward declare foo 
struct foo; 

test.i:

%module test 

// Tell SWIG to wrap foo "properly", but that you don't know anything about it: 
struct foo { }; 

%include "test.h" 

%extend foo { 
    void bar() { 
    // Do stuff, probably with $self, here 
    } 
} 

Der Schlüssel ist, dass in der Schnittstellendatei sind Sie nicht eigentlich C oder C++ im normalen Sinne zu schreiben, Sie‘ Erzähle SWIG, welche Typen und welche Teile jedes Typs zu verpacken sind.

Da Sie vermutlich auf der Bibliothek angewiesen sein Instanzen zu erstellen und zerstören Sie auch hinzufügen möchten:

%nodefaultctor foo; 
%nodefaultdtor foo; 

In der Schnittstellendatei den Konstruktor/Destruktor Erzeugung zu unterdrücken und sie zwingen, zu durchlaufen die Bibliothek.

Verwandte Themen