Réponses:
Il s'agit d'une extension spécifique à Microsoft du langage C ++ qui vous permet d'attribuer un type ou une fonction avec des informations de classe de stockage.
Documentation
Les exemples canoniques sont __declspec(dllimport)
et __declspec(dllexport)
, qui indiquent à 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(..)
résume simplement les éléments spécifiques de Microsoft - pour assurer la compatibilité, on les emballerait généralement avec des macros)
.lib
qu'il trouve qui a un symbole exporté correspondant.
Il est principalement utilisé pour importer / exporter des symboles vers une bibliothèque partagée (DLL). Les compilateurs Visual C ++ et GCC prennent en charge __declspec(dllimport)
et __declspec(dllexport)
. D'autres utilisations (certaines uniquement pour Microsoft) sont documentées dans le MSDN .
Un autre exemple pour illustrer le __declspec clé :
Lorsque vous écrivez un pilote de noyau Windows, vous souhaitez parfois écrire vos propres séquences de code prologue / épilogue à l' aide du code assembleur en ligne , afin que vous puissiez déclarer votre fonction avec l' attribut nu .
__declspec( naked ) int func( formal_parameters ) {}
Ou
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Veuillez vous référer à nu (C ++)
Essentiellement, c'est la façon dont Microsoft introduit ses extensions C ++ afin qu'elles ne soient pas en conflit avec les futures extensions du C ++ standard. Avec __declspec, vous pouvez attribuer une fonction ou une classe; la signification exacte varie selon la nature de __declspec. __declspec (nu), par exemple, supprime la génération de prologue / épilog (pour les gestionnaires d'interruptions, le code intégrable, etc.), __declspec (thread) crée une variable thread-local, et ainsi de suite.
La liste complète des attributs __declspec est disponible sur MSDN et varie selon la version du compilateur et la plate-forme.
GCC 4.2
, qui offre alternative en plus de leur __attribute__ ((dllexport))
à __declspec(dllexport)
, est - il juste d'appeler __declspec
, une extension Microsoft seule?
Je sais que cela fait huit ans mais je voulais partager ce morceau de code trouvé dans MRuby qui montre comment __declspec()
abeille 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
__declspec(dllexport)
avant chaque fonction de votre bibliothèque