Respostas:
Essa é uma extensão específica da Microsoft à linguagem C ++ que permite atribuir um tipo ou função às informações da classe de armazenamento.
Documentação
Os exemplos canônicos são __declspec(dllimport)
e __declspec(dllexport)
, que instruem o vinculador a importar e exportar (respectivamente) um símbolo de ou para uma DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)
apenas encerra as coisas específicas da Microsoft - para obter compatibilidade, normalmente é necessário encerrar com macros)
.lib
que encontrar que possui um símbolo exportado correspondente.
Outro exemplo para ilustrar a palavra- chave __declspec :
Ao escrever um driver de kernel do Windows, às vezes você deseja gravar suas próprias seqüências de código de prólogo / epilog usando o código montador embutido , para poder declarar sua função com o atributo nu .
__declspec( naked ) int func( formal_parameters ) {}
Ou
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Consulte nu (C ++)
Essencialmente, é a maneira como a Microsoft introduz suas extensões C ++ para que não entrem em conflito com futuras extensões do C ++ padrão. Com __declspec, você pode atribuir uma função ou classe; o significado exato varia dependendo da natureza de __declspec. __declspec (naked), por exemplo, suprime a geração de prólogo / epilog (para manipuladores de interrupção, código incorporável etc.), __declspec (thread) torna uma variável local de thread e assim por diante.
A lista completa de atributos __declspec está disponível no MSDN e varia de acordo com a versão e a plataforma do compilador.
GCC 4.2
, essa alternativa oferta para além da sua __attribute__ ((dllexport))
para __declspec(dllexport)
, é justo chamada __declspec
, a Microsoft só de extensão?
Eu sei que já faz oito anos, mas eu queria compartilhar esse código encontrado no MRuby que mostra como __declspec()
pode ser usado no mesmo nível que o 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)
antes de cada função da sua biblioteca