Question

Le Python manuel dit que vous pouvez créer des modules de Python en C et C++.Pouvez-vous profiter de choses comme des classes et des modèles lors de l'utilisation de C++?Ne serait-il pas de créer des incompatibilités avec le reste de la bibliothèques et l'interprète?

Était-ce utile?

La solution

Il n'a pas d'importance si votre mise en œuvre des fonctions de raccordement est implémenté en C ou en C++.En fait, j'ai déjà vu certaines extensions Python qui utilise activement les modèles C++ et même la bibliothèque Boost. Pas de problème. :-)

Autres conseils

Les gens boost ont une belle façon automatisée pour faire l'emballage de code C ++ pour une utilisation par python.

Il est appelé: Boost.Python

Il traite de quelques-unes des constructions de C ++ mieux que SWIG, en particulier métaprogrammation modèle.

Qu'est-ce que vous êtes intéressé par un programme appelé SWIG . Il va générer wrappers Python et interfaces pour le code C ++. Je l'utilise avec des modèles, l'héritage, etc., espaces de noms et il fonctionne bien.

Vous devriez être en mesure d'utiliser toutes les fonctionnalités du langage C ++. Extension Documentation Python (2.6.2) dit que vous pouvez utiliser C ++, mais il mentionne les mises en garde de Suivis:

  

Il est possible d'écrire l'extension   modules en C ++. certaines restrictions   appliquer. Si le programme principal (Python   interprète) est compilé et lié par   le compilateur C, global ou statique   objets avec les constructeurs ne peuvent pas être   utilisé. Ce n'est pas un problème si le   programme principal est relié par le C ++   compilateur. Les fonctions qui seront   appelé par l'interpréteur Python (en   en particulier, l'initialisation du module   fonctions) doivent être déclarés à l'aide   extern "C". Il est inutile de   joindre les fichiers d'en-tête de Python   extern "C" {...} - ils utilisent ce formulaire   déjà si le symbole est __cplusplus   définies (compilateurs ++ tout récent C   définir ce symbole).

La première restriction, « objets globaux ou statiques avec les constructeurs ne peuvent pas être utilisés », a à voir avec la manière la plus compilateur C ++ d'initialiser des objets avec ce type de durée de stockage. Par exemple, considérez le code suivant:

class Foo { Foo() { } };

static Foo f;

int main(int argc, char** argv) {}

Le compilateur doit émettre un code spécial pour que le constructeur « Foo » s'invoqué pour « f » avant principal est exécuté. Si vous avez des objets avec une durée de stockage statique dans votre extension Python et l'interpréteur Python n'est pas compilé et lié C ++, alors ce code d'initialisation spéciale ne sera pas créé.

La deuxième restriction «fonctions qui seront appelées par l'interpréteur Python (dans, les fonctions d'initialisation du module particulier) doivent être déclarés en utilisant extern « C » », a trait à C ++ nom mangling. La plupart des compilateurs C ++ mangle leurs noms afin qu'ils puissent utiliser les mêmes linkers prévues toolchains C. Par exemple que vous avez eu:

void a_function_python_calls(void* foo);

Le compilateur C peut convertir les références au nom de « a_function_python_calls » à quelque chose comme « a_function_python_calls @ 1vga ». Dans ce cas, vous pouvez obtenir un externe non résolu en essayant de créer un lien avec la bibliothèque Python.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top