Maison >développement back-end >C++ >Comment exporter en toute sécurité des classes contenant des objets std :: à partir d'une DLL ?
Lors de l'exportation de classes contenant des types complexes comme std :: vector ou std::map, il est essentiel de fournir une interface DLL pour garantir que les clients puissent accéder à ces membres. Cela signifie déclarer la classe comme DLL_EXPORT et marquer les fonctions et objets membres comme DLL_EXPORT pour autoriser l'accès externe.
L'avertissement C4251 indique qu'un membre de type complexe n'a pas de Interface DLL. Cela peut se produire lors de l'utilisation de types de conteneurs std:: car le compilateur ne peut pas déterminer complètement à quelles méthodes les clients auront accès.
Bien que la déclaration des classes de modèles avec DLL_EXPORT peut sembler supprimer l'avertissement, il n'injecte pas réellement DLL_EXPORT pour les fonctions membres lors de la compilation. Il déclenche simplement son instanciation au sein de l'unité de compilation actuelle.
La déclaration Forward avec DLL_EXPORT ne répond pas complètement à l'avertissement. Pour les membres auxquels les clients doivent accéder, une telle indirection peut être problématique, empêchant potentiellement l'optimisation en ligne.
Dans certains scénarios, il peut être raisonnable de désactiver l'avertissement pour conteneurs standard s'ils sont disponibles via les en-têtes de bibliothèque partagés pour les clients et la DLL. Cependant, cela nécessite un examen attentif des problèmes potentiels avec les opérateurs d'affectation et les constructeurs de copie.
L'utilisation de conteneurs standard dans une interface DLL peut être problématique en raison de la nécessité de Interfaces DLL pour chaque méthode potentielle accessible au client. Comme alternative, il peut être préférable d'encapsuler l'utilisation du conteneur dans des classes d'assistance non exportées ou d'envisager d'utiliser une bibliothèque statique à la place.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!