Qu’est-ce que __declspec et quand dois-je l’utiliser?

J’ai vu des instances de __declspec dans le code que je lis. Qu’Est-ce que c’est? Et quand aurais-je besoin d’utiliser cette construction?

Il s’agit d’une extension Microsoft spécifique au langage C ++ qui vous permet d’atsortingbuer un type ou une fonction avec des informations de classe de stockage.

Documentation

__declspec (C ++)

Les exemples canoniques sont __declspec(dllimport) et __declspec(dllexport) , qui __declspec(dllexport) l’éditeur de liens d’importer et d’exporter (respectivement) un symbole depuis ou vers une DLL.

 // header __declspec(dllimport) void foo(); // code - this calls foo() somewhere in a DLL foo(); 

( __declspec(..) ne fait qu’emballer les éléments spécifiques de Microsoft – pour obtenir la compatibilité, il faut généralement envelopper les macros)

Il est principalement utilisé pour importer des symboles depuis / exporter des symboles vers une bibliothèque partagée (DLL). Les deux compilateurs Visual C ++ et GCC prennent en charge __declspec(dllimport) et __declspec(dllexport) . D’autres utilisations (certaines Microsoft uniquement) sont documentées dans MSDN .

Un autre exemple pour illustrer le mot clé __declspec :

Lorsque vous écrivez un pilote de kernel Windows, vous voulez parfois écrire vos propres séquences de code prolog / epilog en utilisant un code assembleur en ligne , afin que vous puissiez déclarer votre fonction avec l’atsortingbut naked .

 __declspec( naked ) int func( formal_parameters ) {} 

Ou

 #define Naked __declspec( naked ) Naked int func( formal_parameters ) {} 

S’il vous plaît se référer à nu (C ++)

Essentiellement, c’est la façon dont Microsoft introduit ses extensions C ++ afin qu’elles n’entrent pas en conflit avec les futures extensions du standard C ++. Avec __declspec, vous pouvez atsortingbuer une fonction ou une classe; le sens exact varie selon la nature de __declspec. __declspec (nue), par exemple, supprime la génération prolog / epilog (pour les gestionnaires d’interruption, le code incorporable, etc.), __declspec (thread) crée une variable thread-local, etc.

La liste complète des atsortingbuts __declspec est disponible sur MSDN et varie selon la version du compilateur et la plate-forme.

Je sais que cela fait huit ans, mais je voulais partager ce morceau de code trouvé dans MRuby qui montre comment __declspec() peut être utilisé au même niveau que le export keyword .

 /** Declare a public MRuby API function. */ #if defined(MRB_BUILD_AS_DLL) #if defined(MRB_CORE) || defined(MRB_LIB) # define MRB_API __declspec(dllexport) #else # define MRB_API __declspec(dllimport) #endif #else # define MRB_API extern #endif