2009-02-23 5 views
3

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?

+0

Mais pourquoi voulez-vous faire cela? –

+0

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. :-) –

Répondre

3

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.

4

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.

2

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).

0

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.

Questions connexes