N'y a-t-il aucun moyen d'éviter le changement de nom des classes C++ et de ses fonctions membres lorsqu'elles sont exposées à partir d'une DLL C++. Est-ce que je ne peux pas utiliser un mécanisme de fichier def à cet égard?Nom mangling des classes C++ et ses fonctions membres?
Répondre
Je pense que la meilleure façon de le faire est de fournir des wrappers C autour de la bibliothèque C++. C'était assez populaire il y a 10 ans ou plus quand je programmais en C++ mais je ne sais pas si c'est plus fait.
En fait, pour chaque class C
, pour chaque constructeur ctor
être exposé à créer une méthode extern "C" CPtr cCtor(....)
qui renvoie un pointeur opaque CPtr
et pour chaque fonction func
être exposé vous créez extern "C" cFunc(CPtr,....)
Une autre approche est de créer un CStruct
qui a des variables membres de type pointeur de fonction, les implémenter pour appeler les méthodes de classe et laisser le client faire tout le travail dur.
Je ne crois pas. La gestion des noms est utilisée pour que chaque fonction surchargée ait un nom différent vu par l'éditeur de liens.
Vous pouvez les réécrire en C et utiliser la construction extern "C" {}
mais vous perdez alors tout votre bel héritage, votre polymorphisme et ainsi de suite. Vous pouvez également placer le C++ dans les fonctions C et n'exposer que les fonctions C.
La seule façon que je pourrais penser est de déclarer des fonctions comme externe "C". Le nom mangling est requis pour que l'éditeur de liens fasse la distinction, par ex. fonctions surchargées par leur liste de paramètres (qui serait indisponible à l'éditeur de liens si ce n'est pour le nom mangling).
La fonction virtuelle serait la réponse je pense, avez-vous remarqué COM, créer une instance, il vous donne un pointeur vers cette interface représentée comme classe. Je suppose que les méthodes déclarées ne sont pas résolues par le nom, mais par l'indice de logement.
- 1. Fonctions membres C++ vs fonctions libres
- 2. Membres privés et protégés: C++
- 3. classes et fonctions
- 4. C# réflexion et l'héritage des membres statiques
- 5. classes imbriquées dans des fonctions et des attributs de recherche
- 6. mvc2 Html.label ("mystring") mangling
- 7. Classe d'amis et tous ses descendants
- 8. Liste des fonctions C++
- 9. Comportement virtuel en stockant des pointeurs sur les fonctions membres
- 10. Structurer un programme. Classes et fonctions en Python
- 11. Liste des classes d'un assemblage
- 12. C fonctions surutilisation des paramètres?
- 13. (Obj) C++: Instancier (référence à) classe à partir du modèle, accéder à ses membres?
- 14. C: analyse de dépendance des fonctions
- 15. Accès aux membres protégés de sous-classes: gcc vs msvc
- 16. C struct - membres légaux?
- 17. Code utilisant des classes et des interfaces
- 18. Comment puis-je séparer les en-têtes, les classes et les fonctions principales en C++?
- 19. ASP.NET Webforms et Jquery - stratégie pour gérer les ID mangling
- 20. Quelle est la meilleure utilisation que vous avez faite du pointeur vers les membres et les fonctions membres?
- 21. Inclusion/exclusion conditionnelle des données Membres dans les modèles de classes
- 22. spécialisation de modèle pour les fonctions membres statiques; comment?
- 23. C# - Sur les classes et la mémoire
- 24. Masquage de membres de données privés? (C++)
- 25. L'héritage RTTI C++ augmente la taille des classes
- 26. OpenID et ses défauts
- 27. C++ modèles et déclarations de fonctions externes
- 28. C# Héritage, accès aux membres enfants avec les fonctions de base?
- 29. problème C++ des fonctions mathématiques (sous Linux)
- 30. Callbacks C++ utilisant des fonctions Boost et des méthodes de classe C++
Mais pourquoi voulez-vous faire cela? –
Ce n'est pas intentionnel .. J'étais juste curieux de voir si je pouvais utiliser mes classes exportées sur n'importe quel autre fournisseur où linker ferait le mangling à sa manière. :-) –