He visto instancias de __declspec en el código que estoy leyendo. ¿Qué es? ¿Y cuándo necesitaría usar esta construcción?¿Qué es __declspec y cuándo debo usarlo?
Respuesta
Esta es una extensión específica de Microsoft para el lenguaje C++ que le permite atribuir un tipo o función con información de la clase de almacenamiento.
Documentación
Los ejemplos canónicas son __declspec(dllimport)
y __declspec(dllexport)
, que instruya al enlazador para la importación y exportación (respectivamente) un símbolo desde o hacia un DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
(__declspec(..)
simplemente envuelve la materia específica de Microsoft - para lograr la compatibilidad, uno generalmente se envuelve distancia con macros)
¿cómo sabes a qué dll dllimport está apuntando? – tetris
@tetris, usted no sabe por el código. La decisión la toma el vinculador, quien seleccionará el primer '.lib' que encuentre que tiene un símbolo exportador coincidente. –
Esencialmente, es la forma en que Microsoft presenta sus extensiones en C++ para que no entren en conflicto con futuras extensiones de C++ estándar. Con __declspec, puede atribuir una función o clase; el significado exacto varía según la naturaleza de __declspec. __declspec (desnudo), por ejemplo, suprime la generación de prólogo/epilog (para controladores de interrupción, código incrustable, etc.), __declspec (thread) hace una variable thread-local, y así sucesivamente.
La lista completa de los atributos __declspec está disponible en MSDN y varía según la plataforma y la versión del compilador.
Considerando compiladores que no son de Microsoft como 'GCC 4.2', que ofrecen una alternativa además de su' __tributo__ ((dllexport)) 'a' __declspec (dllexport) ', ¿es justo llamar a' __declspec', una extensión solo de Microsoft? – user2338150
Se utiliza principalmente para importar símbolos de/exportar símbolos a una biblioteca compartida (DLL). Los compiladores de Visual C++ y GCC son compatibles con __declspec(dllimport)
y __declspec(dllexport)
. Otros usos (algunos solo de Microsoft) están documentados in the MSDN.
Otro ejemplo para ilustrar la palabra clave declspec:
Cuando usted está escribiendo un controlador de núcleo de Windows, a veces se desea escribir su propio prólogo/código de epílogo secuencias utilizando el código ensamblador en línea, por lo que podría declarar su función con el atributo naked.
__declspec(naked) int func(formal_parameters) {}
O
#define Naked __declspec(naked)
Naked int func(formal_parameters) {}
Por favor refiérase a naked (C++)
- 1. ¿Qué es Request.InputStream y cuándo usarlo?
- 2. ¿Qué es ICustomTypeDescriptor y cuándo usarlo?
- 3. ¿Qué es un MvcHtmlString y cuándo debería usarlo?
- 4. ¿Cuándo usar == y cuándo usarlo?
- 5. ¿Para qué es <spring:bind>? ¿Cuándo usarlo y cuándo no usarlo?
- 6. ¿Qué es la delegación? ¿Cuándo querría usarlo?
- 7. ¿Qué es el bean scope y cuándo usarlo?
- 8. ¿Qué es un simulacro y cuándo deberías usarlo?
- 9. ¿Qué es un ÍNDICE ESPACIAL y cuándo debería usarlo?
- 10. explicación de D_GNU_SOURCE ¿Por qué usarlo y cuándo?
- 11. CompositeWPF: EventAggregator: ¿cuándo usarlo?
- 12. ¿Qué es .inc y por qué usarlo?
- 13. @ModelAttribute anotación, ¿cuándo usarlo?
- 14. python y ruby: ¿para qué usarlo?
- 15. Google App Engine: cuándo usarlo, cuándo no?
- 16. ¿Para qué sirve XML y cuándo debería usarlo?
- 17. ¿Qué es un MQ y por qué quiero usarlo?
- 18. ¿Para qué sirve AppDelegate y cómo sé cuándo usarlo?
- 19. ¿Qué significa "sin firmar" en MySQL y cuándo usarlo?
- 20. ¿Qué es un "Trabajo" (proceso secundario) en Windows y cuándo usarlo?
- 21. ¿Qué es MVVM, y deberíamos usarlo?
- 22. ¿Qué es EGL y cómo puedo usarlo?
- 23. ¿Qué es LD_LIBRARY_PATH y cómo usarlo?
- 24. ¿Qué es NHibernate y por qué debería usarlo?
- 25. ¿Debo llamar a MessageDigest.reset() antes de usarlo?
- 26. ¿Qué es PDO y por qué debería usarlo?
- 27. ¿Qué es JAXB y por qué debería usarlo?
- 28. ¿Qué es SAPI y cuándo lo usarías?
- 29. compuesto_de en Rieles: ¿cuándo usarlo?
- 30. ¿Qué tan bien respaldado está <base>? ¿Debo usarlo?
Gracias - pero lo que iba a usar? –
Para declarar interfaces y clases COM, por ejemplo, utiliza __declspec (uuid), para exportar funciones sin un archivo DEF, utiliza __declspec (dllexport), etc. La lista completa es bastante larga. –
@ScottJ Lo uso constantemente para propiedades: __declspec (propiedad (get = X put = X)) identificador de tipo de datos. MSDN tiene más detalles, por supuesto. Como programador de "C# a C/C++", ¡es una bendición! – MasterMastic