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 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 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 gens trouvent qu'il est beaucoup plus facile d'utiliser ces extensions de langue que de créer des fichiers DEF.
Pour des raisons évidentes, __declspec(dllimport)
et __declspec(dllexport)
sont généralement associés. 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 parce que 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 utilise l'interface de la DLL, il s'agit d'un modèle courant pour définir une macro qui se résout automatiquement en le 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 marquer tous les symboles qui doivent être exportés avec DLLEXPORT
.
Vraisemblablement, c'est ce que fait la macro Q_CORE_EXPORT
, Qui se résout en Q_DECL_IMPORT
Ou Q_DECL_EXPORT
.
__declspec(dllimport)
est un spécificateur de classe de stockage qui indique au compilateur qu'une fonction ou un objet ou un type de données est défini dans une DLL externe.
La fonction ou l'objet ou le type de données est exporté à partir d'un DLL avec un __declspec(dllexport)
correspondant.
Cela signifie que la définition de la fonction se trouve dans une bibliothèque dynamique. Reportez-vous à la documentation pour plus de détails et d'exemples.