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.