Ho visto esempi di __declspec nel codice che sto leggendo. Che cos'è? E quando avrei bisogno di usare questo costrutto?Che cos'è __declspec e quando devo usarlo?
risposta
Questa è un'estensione specifica Microsoft per il linguaggio C++ che consente di attribuire un tipo o funzione con informazioni classe di memoria.
Documentazione
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)
come fai a sapere a chi sta indirizzando dll dllimport? – tetris
@tetris, non si sa dal codice. La decisione viene presa dal linker, che sceglierà il primo '.lib' che trova un simbolo esportato corrispondente. –
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.
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
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.
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++)
- 1. SignInManager, che cos'è e come, quando usarlo?
- 2. Cosa fa EntityManager.flush e perché devo usarlo?
- 3. cos'è ICustomTypeDescriptor e quando usarlo?
- 4. Cos'è Request.InputStream e quando usarlo?
- 5. spiegazione di D_GNU_SOURCE Perché usarlo e quando?
- 6. polimorfico_allocatore: quando e perché dovrei usarlo?
- 7. Che cos'è un mock e quando dovresti usarlo?
- 8. Che cos'è un MvcHtmlString e quando dovrei usarlo?
- 9. Che cos'è la delega? Quando dovrei usarlo?
- 10. Cosa fa effettivamente "trust proxy" in express.js e devo usarlo?
- 11. Devo chiamare MessageDigest.reset() prima di usarlo?
- 12. @ModelAttribute annotazione, quando usarlo?
- 13. Che cos'è l'NHibernate e perché dovrei usarlo?
- 14. Differenza tra _declspec e __declspec?
- 15. Differenza tra id e class in CSS e quando usarlo
- 16. Che cos'è pyximport e come dovrei usarlo?
- 17. viewview android viewview. quando usarlo, e quando non su
- 18. __declspec (dllimport) come caricare biblioteca
- 19. Quando devo usare e commerciale con scanf()
- 20. composto da Rails - quando usarlo?
- 21. Che cos'è JBPM? Perché usarlo?
- 22. Visual Studio C++: quando dovrei usare __declspec (dllimport)?
- 23. cosa non ha scope scope e quando usarlo?
- 24. Che cos'è un MQ e perché voglio usarlo?
- 25. Devo controllare boost :: shared_ptr o std :: shared_ptr prima di usarlo?
- 26. pitone e rubino - per cosa usarlo?
- 27. Che cos'è un indice di testo completo e quando dovrei usarlo?
- 28. Che cosa significa notation() => significa e come usarlo?
- 29. Qual è il modo corretto di usare v8 :: Locker e perché devo usarlo?
- 30. Quando devo usare un Bigarray e perché?
Grazie - ma che cosa dovrei usarlo per? –
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. –
@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