__declspecest 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 dllimportet 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 .DEFfichier 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 dllexportpour marquer un symbole comme exporté à partir d'une DLL et vous utilisez dllimportpour 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_EXPORTmacro, résolvant soit Q_DECL_IMPORTou Q_DECL_EXPORT.