Comment puis-je utiliser la Bibliothèque Standard (STL) des classes dans mon interface de dll ou ABI?
Il y a eu quelques questions sur l'exportation d'une classe qui contient stl classes par rapport à visual studio avertissement C4251: E. g. cette question ou cette question.
J'ai déjà lu l'excellente explication à UnknownRoad.
Aveuglément la désactivation de l'avertissement semble un peu dangereux, mais il peut être une option. Emballage tous ceux std classes et l'exportation de ceux-ci n'est pas vraiment une option. Après tout, il est appelé le Standard Modèle de Bibliothèque... I. e., on veut fournir une interface avec ces classes standard.
Comment puis-je utiliser la stl classes dans ma dll de l'interface? Ce sont des pratiques courantes?
- La réponse est de ne pas.va essayer d'élaborer plus tard.
- Quel est l'intérêt d'avoir un Standard modèle de la bibliothèque, quand on ne peut en toute sécurité dans la conception de notre API avec eux?
- Le TSL n'a pas été conçu pour résoudre ce problème. En effet, la Norme ne dit rien de l'Api, Dll, ou quelque chose comme ça.
Vous devez vous connecter pour publier un commentaire.
Garder à l'esprit une chose avant de lire plus loin: Ma réponse est à venir à partir du point de vue de l'écriture du code portable qui peut être utilisé dans des applications composées de modules compilés sous différents compilateurs. Cela peut inclure des versions différentes ou même différents niveaux de correction du même compilateur.
Réponse: on ne peut souvent pas1.
Raison: Le TSL est une bibliothèque de code, pas un binaire de la bibliothèque comme un DLL. Il n'a pas un seul ABI qui est garanti d'être le même partout où vous pourriez l'utiliser. En effet, STL ne signifient "Standard Modèle de Bibliothèque", mais un mot ici, en plus de la Norme est Modèle.
La Norme définit les méthodes et les données de chacun des membres de STL classe est tenu de fournir, et il définit ce que ces méthodes sont à faire, mais pas plus. En particulier, la Norme ne précise pas comment les rédacteurs du compilateur doit mettre en œuvre la Norme définie par la fonctionnalité. Les rédacteurs du compilateur est libre de fournir une implémentation de la STL classe qui ajoute des fonctions de membre et de membre des variables pas indiqué dans la Norme, à condition que ces membres qui sont défini dans la Norme sont toujours là et de faire ce que dit la Norme.
Peut-être un exemple en est, dans l'ordre. Le
basic_string
classe est définie dans la Norme comme ayant certaines fonctions de membre & variables. La définition même de près de 4 pages dans la Norme, mais voici juste un extrait de celui-ci:Envisager la
size()
etlength()
fonctions de membre. Il n'y a rien dans la Norme qui est spécifié pour les variables de membre de la tenue de cette information. En effet, il n'y a aucun membre variables définies, même pas à contenir la chaîne elle-même. Alors comment est-ce mis en œuvre?La réponse est, de nombreuses façons différentes. Certains compilateurs peuvent utiliser un
size_t
membre de la variable pour contenir la taille et unchar*
pour contenir la chaîne. De l'autre, on peut utiliser un pointeur à un autre magasin de données qui détient des données (ce peut être le cas dans une référence compte de la mise en œuvre). En fait, des versions différentes ou même niveaux de correction de la même compilateur peut modifier ces détails de mise en œuvre. Vous ne pouvez pas compter sur eux. Donc, MSVC 10 de la mise en œuvre pourrait ressembler à ceci:...Alors que MSVC 10 avec SP1 pourrait ressembler à ceci:
Je ne dis pas qu'ils ne ressembler à cela, je suis en train de dire qu'ils le peuvent. Le point ici est la mise en œuvre effective est dépend de la plateforme, et vous avez vraiment aucun moyen de savoir ce qu'elle va être n'importe où ailleurs.
Disent maintenant que vous utilisez MSVC10 écrire une DLL que les exportations de cette classe:
Quel est le
sizeof(MyGizmo)
?En supposant que ma implémentations proposées ci-dessus, sous MSVC10 sa va être
sizeof(char*)
, mais sous SP1, il serasizeof(vector<char>)
. Si vous écrivez une application dans VC10 SP1 qui utilise la DLL, la taille de l'objet va être différent de ce qu'il est réellement. L'interface binaire est changé.Pour un autre traitement de ce sujet, consultez C++ Normes de Codage (Amazon lien) question n ° 63.
1: "on ne peut souvent pas" Vous pouvez exporter la Bibliothèque Standard de composants ou de tout autre code de la bibliothèque de composants (tels que Boost) avec une bonne quantité de fiabilité lorsque vous avez le contrôle complet sur les toolchains et les bibliothèques.
Le problème fondamental est que le code source des bibliothèques de la taille et des définitions de choses peuvent être différentes entre les différents compilateurs et les différentes versions de la bibliothèque. Si vous travaillez dans un environnement où vous contrôlez à la fois de ces choses partout votre code est utilisé, alors vous n'aurez probablement pas un problème. Par exemple, à une entreprise de commerce où tous les systèmes sont écrits en interne et utilisées uniquement en interne, il pourrait être possible de le faire.