Je cherche un moyen d’étendre (c’est-à-dire d’append de nouveaux membres à un type à l’aide de la directive% extend) un type défini dans le fichier de bibliothèque lui-même, tandis que les fichiers d’en-tête de la bibliothèque fournissent uniquement une déclaration en aval pour le type.
Traiter le type comme si sa définition était connue au moment de la compilation entraîne l’avertissement suivant:
Warning 303: %extend defined for an undeclared class [name of the type].
Est-ce que quelqu’un est au courant d’une solution ou d’une solution de contournement pour ce problème? Je suis sûr qu’il y en a un, car la documentation de SWIG indique que swig suppose que le type inconnu est une structure ou une union à chaque fois qu’il en trouve une.
Merci d’avance!
Vous pouvez très facilement append des méthodes supplémentaires à un type qui a été déclaré en aval dans SWIG en lui donnant une définition vide dans l’interface, par exemple
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 } }
La clé est que, dans le fichier d’interface, vous n’écrivez pas réellement C ou C ++ dans le sens habituel, vous indiquez à SWIG quels types et quelles parties de chaque type à insérer.
Puisque vous comptez probablement sur la bibliothèque pour créer et détruire des instances, vous voudrez également append:
%nodefaultctor foo; %nodefaultdtor foo;
Dans le fichier d’interface, supprimez la génération constructeur / destructeur et forcez-la à parcourir la bibliothèque.