__declspec
est un attribut spécifique à Microsoft qui vous permet de spécifier des informations de classe de stockage.
(Nitpicker's Corner: Cependant, un certain nombre d'autres fournisseurs de compilateurs - par exemple GCC - prennent désormais en charge cette extension de langage pour la compatibilité avec la base de code installée qui a été écrite pour les compilateurs de Microsoft. Certains fournissent même des attributs de classe de stockage supplémentaires.)
Deux de ces attributs de classe de stockage qui peuvent être spécifiés sont dllimport
et dllexport
. Ceux-ci indiquent au compilateur qu'une fonction ou un objet est importé ou exporté (respectivement) à partir d'une DLL.
Plus spécifiquement, ils définissent l'interface de la DLL avec le client sans avoir besoin d'un .DEF
fichier module-definition ( ). La plupart des gens trouvent qu'il est beaucoup plus facile d'utiliser ces extensions de langage que de créer des fichiers DEF.
Pour des raisons évidentes, __declspec(dllimport)
et __declspec(dllexport)
sont généralement jumelés les uns aux autres. Vous utilisez dllexport
pour marquer un symbole comme exporté à partir d'une DLL et vous utilisez dllimport
pour importer ce symbole exporté dans un autre fichier.
Pour cette raison, et comme le même fichier d'en-tête est généralement utilisé à la fois lors de la compilation de la DLL et dans le code client qui consomme l'interface de la DLL, il s'agit d'un modèle courant pour définir une macro qui se résout automatiquement en spécificateur d'attribut approprié au moment de la compilation. Par exemple:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Et puis en marquant tous les symboles avec lesquels exporter DLLEXPORT
.
Vraisemblablement, c'est ce que fait la Q_CORE_EXPORT
macro, résolvant soit Q_DECL_IMPORT
ou Q_DECL_EXPORT
.