Risposte:
Questa è un'estensione specifica di Microsoft al linguaggio C ++ che consente di attribuire un tipo o una funzione con le informazioni sulla classe di archiviazione.
Documentazione
Gli esempi canonici sono __declspec(dllimport)e __declspec(dllexport), che indicano al linker di importare ed esportare (rispettivamente) un simbolo da o verso una DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)racchiude semplicemente le cose specifiche di Microsoft - per ottenere la compatibilità, di solito si finisce con le macro)
.libche trova che ha un simbolo esportato corrispondente.
Un altro esempio per illustrare la parola chiave __declspec :
Quando si scrive un driver del kernel di Windows, a volte si desidera scrivere le proprie sequenze di codici prolog / epilog utilizzando il codice assembler inline , in modo da poter dichiarare la propria funzione con l' attributo naked .
__declspec( naked ) int func( formal_parameters ) {}
O
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Si prega di fare riferimento a nudo (C ++)
In sostanza, è il modo in cui Microsoft introduce le sue estensioni C ++ in modo che non entrino in conflitto con le future estensioni dello standard C ++. Con __declspec, puoi attribuire una funzione o una classe; il significato esatto varia a seconda della natura di __declspec. __declspec (naked), ad esempio, sopprime la generazione di prolog / epilog (per gestori di interrupt, codice incorporabile, ecc.), __declspec (thread) crea una variabile thread-local e così via.
L'elenco completo degli attributi __declspec è disponibile su MSDN e varia in base alla versione e alla piattaforma del compilatore.
GCC 4.2, che un'offerta alternativa in aggiunta alla loro __attribute__ ((dllexport))a __declspec(dllexport), è giusto chiamata __declspec, un Microsoft-solo l'estensione?
So che sono passati otto anni, ma volevo condividere questo pezzo di codice trovato in MRuby che mostra come si __declspec()può usare l'ape allo stesso livello di 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)prima di ogni funzione nella tua libreria