2010-02-17 9 views

Antwort

52

Dies ist eine Microsoft-spezifische Erweiterung der C++ - Sprache, mit der Sie einem Typ oder einer Funktion Speicherklasseninformationen zuordnen können.

Dokumentation

__declspec (C++)

+7

Danke - aber was würde ich es nutzen? –

+4

Zum Deklarieren von COM-Schnittstellen und -Klassen verwenden Sie beispielsweise __declspec (uuid). Zum Exportieren von Funktionen ohne DEF-Datei verwenden Sie __declspec (dllexport) usw. Die vollständige Liste ist ziemlich lang. –

+1

@ScottJ Ich benutze es ständig für Eigenschaften: __declspec (Eigenschaft (get = X put = X)) Datentypkennung. MSDN hat natürlich mehr Details. Als "C# zu C/C++ Programmierer" ist es eine Glückseligkeit! – MasterMastic

34

Die kanonischen Beispiele sind __declspec(dllimport) und __declspec(dllexport), die den Linker zu importieren und zu exportieren (jeweils) ein Symbol von oder zu einer DLL anweisen.

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


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

(__declspec(..) wickelt nur auf Microsofts spezielle Sachen - Kompatibilität zu erreichen, würde man es in der Regel wickelt mit Makros entfernt)

+6

woher wissen Sie, auf welche dll dllimport zeigt? – tetris

+2

@tetris, Sie wissen nicht aus dem Code. Die Entscheidung wird durch den Linker getroffen, der die erste gefundene ".lib" auswählt, die ein passendes exportiertes Symbol hat. –

6

Im Wesentlichen ist es die Art und Weise Microsoft seine C++ Erweiterungen eingeführt, so dass sie nicht in Konflikt mit zukünftigen Erweiterungen von Standard C++. Mit __declspec können Sie eine Funktion oder Klasse zuordnen; Die genaue Bedeutung hängt von der Art von __declspec ab. __declspec (nackt), zum Beispiel unterdrückt Prolog/Epilog-Generierung (für Interrupt-Handler, einbettbaren Code, etc), __declspec (Thread) macht eine Variable Thread-lokal, und so weiter.

Die vollständige Liste der __declspec-Attribute ist auf MSDN verfügbar und variiert je nach Compilerversion und Plattform.

+0

Betrachtet man nicht-microsoft Compiler wie 'GCC 4.2', die zusätzlich zu ihren' __attribute__ ((dllexport)) 'zu' __declspec (dllexport) 'anbieten, ist es fair,' __declspec' zu nennen, eine Microsoft-Erweiterung? – user2338150

16

Es wird meist zum Importieren von Symbolen aus/zum Exportieren von Symbolen in eine gemeinsam genutzte Bibliothek (DLL) verwendet. Sowohl Visual C++ - als auch GCC-Compiler unterstützen __declspec(dllimport) und __declspec(dllexport). Andere Verwendungen (einige nur Microsoft) sind dokumentiert in the MSDN.

10

Ein weiteres Beispiel der Declspec Stichwort illustrieren:

Wenn Sie einen Windows-Kernel-Treiber schreiben, manchmal möchten Sie Ihre eigenen prolog/Epilog-Code-Sequenzen Code Inline-Assembler mit, schreiben, so dass Sie erklären könnte Ihre Funktion mit dem nackt Attribut.

__declspec(naked) int func(formal_parameters) {} 

Oder

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

verweisen auf naked (C++)

Verwandte Themen