2010-02-17 36 views

risposta

52

Questa è un'estensione specifica Microsoft per il linguaggio C++ che consente di attribuire un tipo o funzione con informazioni classe di memoria.

Documentazione

__declspec (C++)

+7

Grazie - ma che cosa dovrei usarlo per? –

+4

Per la dichiarazione di interfacce e classi COM, ad esempio, si utilizza __declspec (uuid), per l'esportazione di funzioni sans un file DEF si utilizza __declspec (dllexport), ecc. L'elenco completo è piuttosto lungo. –

+1

@ScottJ ho costantemente lo uso per le proprietà: __declspec (proprietà (get = X mettere = X)) i dati di tipo identificativo. MSDN ha più dettagli, naturalmente. Come "C# per C/C++ programmatore" E 'una gioia! – MasterMastic

34

Gli esempi canonici sono __declspec(dllimport) e __declspec(dllexport), che istruiscono il linker di importare ed esportare (rispettivamente) un simbolo da o per una DLL.

// header 
__declspec(dllimport) void foo(); 


// code - this calls foo() somewhere in a DLL 
foo(); 

(__declspec(..) avvolge solo su cose specifiche di Microsoft - per ottenere la compatibilità, si potrebbe solito avvolgerlo via con le macro)

+6

come fai a sapere a chi sta indirizzando dll dllimport? – tetris

+2

@tetris, non si sa dal codice. La decisione viene presa dal linker, che sceglierà il primo '.lib' che trova un simbolo esportato corrispondente. –

6

In sostanza, è il modo in cui Microsoft introduce le sue estensioni C++ in modo che non entrino in conflitto con future estensioni del C++ standard. Con __declspec, puoi attribuire una funzione o una classe; il significato esatto varia a seconda della natura di __declspec. __declspec (nudo), per esempio, sopprime prolog/generazione epilog (per gestori di interrupt, codice incorporabile, ecc), __declspec (thread) effettua una variabile locale dei thread, e così via.

L'elenco completo dei __declspec attributi è disponibile su MSDN, e varia a seconda della versione del compilatore e la piattaforma.

+0

Considerando i compilatori non-microsoft come 'GCC 4.2', che offrono un'alternativa oltre a' __attribute__ ((dllexport)) 'a' __declspec (dllexport) ', è corretto chiamare' __declspec', un'estensione solo per Microsoft? – user2338150

16

Viene principalmente utilizzato per l'importazione di simboli da/esportare simboli in una libreria condivisa (DLL). Entrambi i compilatori Visual C++ e GCC supportano __declspec(dllimport) e __declspec(dllexport). Altri usi (alcuni solo Microsoft) sono documentati in the MSDN.

10

Un altro esempio per illustrare la parola __declspec:

Quando si scrive un driver del kernel di Windows, a volte si desidera scrivere il proprio prologo/code epilogo sequenze utilizzando il codice assembler inline, così si potrebbe dichiarare la tua funzione con l'attributo nudo.

__declspec(naked) int func(formal_parameters) {} 

O

#define Naked __declspec(naked) 
Naked int func(formal_parameters) {} 

prega riferisco a naked (C++)

Problemi correlati