Que signifie vraiment __declspec (dllimport)?

J’ai vu le code source de Qt comme ceci:

class Q_CORE_EXPORT QBasicAtomicInt { public: ... }; 

Quelle macro Q_CORE_EXPORT définit comme ci-dessous:

 define Q_DECL_IMPORT __declspec(dllimport) 

Alors, que signifie vraiment __declspec(dllimport) ?

__declspec est un atsortingbut spécifique à Microsoft qui vous permet de spécifier des informations sur la 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 langue pour la compatibilité avec la base de code installée ciblant les compilateurs Microsoft. Certains fournissent même des atsortingbuts de classe de stockage supplémentaires.)

Deux des atsortingbuts de classe de stockage pouvant être spécifiés sont dllimport et dllexport . Ceux-ci indiquent au compilateur qu’une fonction ou un object est importé ou exporté (respectivement) à partir d’une DLL.

Plus précisément, ils définissent l’interface de la DLL avec le client sans nécessiter de fichier de définition de module ( .DEF ). La plupart des utilisateurs trouvent 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 associés entre eux. 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.

De ce fait et comme le même fichier d’en-tête est généralement utilisé lors de la compilation de la DLL et du code client qui utilise l’interface de la DLL, il est courant de définir une macro qui se résout automatiquement au spécificateur d’atsortingbut approprié au moment de la compilation. Par exemple:

 #if COMPILING_DLL #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __declspec(dllimport) #endif 

Et ensuite marquer tous les symboles devant être exportés avec DLLEXPORT .

C’est probablement ce que fait la macro Q_CORE_EXPORT résolvant soit Q_DECL_IMPORT soit Q_DECL_EXPORT .

__declspec(dllimport) est un spécificateur de classe de stockage qui indique au compilateur qu’une fonction, un object ou un type de données est défini dans une DLL externe.

La fonction ou l’object ou le type de données est exporté à partir d’une DLL avec un __declspec(dllexport) .

Cela signifie que la définition de la fonction est dans une bibliothèque dynamic. Reportez-vous à la documentation pour plus de détails et d’exemples.