Ich habe Instanzen von __declspec in dem Code, den ich gerade lese, gesehen. Was ist es? Und wann müsste ich dieses Konstrukt benutzen?Was ist __declspec und wann muss ich es verwenden?
Antwort
Dies ist eine Microsoft-spezifische Erweiterung der C++ - Sprache, mit der Sie einem Typ oder einer Funktion Speicherklasseninformationen zuordnen können.
Dokumentation
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)
woher wissen Sie, auf welche dll dllimport zeigt? – tetris
@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. –
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.
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
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.
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++)
- 1. Wann muss ich @WebServiceRef verwenden?
- 2. Wann muss ich MPI_Barrier() verwenden?
- 3. Was ist ein Mock und wann sollten Sie es verwenden?
- 4. Wofür ist XML gut und wann sollte ich es verwenden?
- 5. SignInManager, was ist es und wie, wann zu verwenden?
- 6. Was ist SAPI und wann würden Sie es verwenden?
- 7. Was ist kein Bereich Bean und wann es zu verwenden?
- 8. Was ist SELF JOIN und wann würdest du es verwenden?
- 9. Was macht EntityManager.flush und warum muss ich es verwenden?
- 10. Wann muss ich die READ_GSERVICES-Berechtigung verwenden?
- 11. Wann muss ich boost :: asio: strang verwenden
- 12. Was ist ein Volltextindex und wann sollte ich ihn verwenden?
- 13. Was und wann Tuple verwenden?
- 14. Wann ist es gut, FTP zu verwenden?
- 15. Wann verwende ich Fabs und wann ist es ausreichend, std :: abs zu verwenden?
- 16. CancellationTokenSource, Wann muss ich disponieren?
- 17. Was ist der Datentyp Bytea und wann würde ich es verwenden?
- 18. Was ist der Zweck von ROWLOCK beim Löschen und wann sollte ich es verwenden?
- 19. Wann ist es sicher, .toString() zu verwenden?
- 20. Was ist Ninject und wann benutzt du es?
- 21. Wann System() verwenden und wann execv *() verwenden?
- 22. Wann ist es angebracht, NOLOCK zu verwenden?
- 23. Was ist der openssl-Befehl, den ich dafür verwenden muss?
- 24. Wann muss ich session_start(); deklarieren?
- 25. Was ist Dojo und wie man es in asp.net verwendet? und wann sollten wir es benutzen?
- 26. Was ist Delegation? Wann würde ich es benutzen wollen?
- 27. Was ist Func, wie und wann wird es verwendet?
- 28. Was ist std :: Verfall und wann sollte es verwendet werden?
- 29. Was ist SS_X_JSESSIONID und wann wird es erstellt?
- 30. Wann muss ich ByteBuf.retain() in einem Netty4 Encoder verwenden?
Danke - aber was würde ich es nutzen? –
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. –
@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