Che cos'è __declspec e quando devo utilizzarlo?


157

Ho visto casi __declspecnel codice che sto leggendo. Che cos'è? E quando dovrei usare questo costrutto?


1
Se sei stato sfortunato e ti sei trasferito da Linux a Windows, potresti perdere tempo cercando di capire perché le tue DLL non funzionerebbero, fino a quando non scoprirai che devi aggiungere __declspec(dllexport)prima di ogni funzione nella tua libreria
SomethingSomething

Risposte:


74

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

__declspec (C ++)


19
Grazie - ma per cosa lo userei?
Scott J,

4
Per dichiarare interfacce e classi COM, ad esempio, si utilizza __declspec (uuid), per esportare funzioni senza un file DEF si utilizza __declspec (dllexport), ecc. L'elenco completo è piuttosto lungo.
Seva Alekseyev,

1
@ScottJ Lo uso costantemente per le proprietà: __declspec (proprietà (get = X put = X)) identificatore del tipo di dati. MSDN ha ovviamente maggiori dettagli. Come "programmatore da C # a C / C ++" è una gioia!
MasterMastic

51

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)


8
@tetris, non sai dal codice. La decisione viene presa dal linker, che sceglierà il primo .libche trova che ha un simbolo esportato corrispondente.
Euro Micelli,

19

Viene utilizzato principalmente per l'importazione di simboli da / esportazione di simboli in una libreria condivisa (DLL). Supporta __declspec(dllimport)sia compilatori Visual C ++ che GCC __declspec(dllexport). Altri usi (alcuni solo Microsoft) sono documentati in MSDN .


12

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


8

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.


1
Considerando compilatori non-Microsoft, come GCC 4.2, che un'offerta alternativa in aggiunta alla loro __attribute__ ((dllexport))a __declspec(dllexport), è giusto chiamata __declspec, un Microsoft-solo l'estensione?
user2338150

0

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.