web-dev-qa-db-fra.com

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)?

78
gemfield

__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.

101
Cody Gray

__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.

22
arx

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.

1
Armen Tsirunyan