Respuestas:
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 clase de almacenamiento.
Documentación
Los ejemplos canónicos son __declspec(dllimport)y __declspec(dllexport), que le indican al vinculador que importe y exporte (respectivamente) un símbolo desde o hacia un archivo DLL.
// header
__declspec(dllimport) void foo();
// code - this calls foo() somewhere in a DLL
foo();
( __declspec(..)solo envuelve las cosas específicas de Microsoft: para lograr la compatibilidad, uno generalmente lo envolvería con macros)
.libque encuentre que tenga un símbolo exportado coincidente.
Se utiliza principalmente para importar símbolos de / exportar símbolos a una biblioteca compartida (DLL). Tanto los compiladores de Visual C ++ como GCC son compatibles __declspec(dllimport)y __declspec(dllexport). Otros usos (algunos solo de Microsoft) están documentados en el MSDN .
Otro ejemplo para ilustrar la palabra clave __declspec :
Cuando está escribiendo un controlador de kernel de Windows, a veces desea escribir sus propias secuencias de código de prólogo / epílogo utilizando código de ensamblador en línea , para que pueda declarar su función con el atributo simple .
__declspec( naked ) int func( formal_parameters ) {}
O
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
Consulte desnudo (C ++)
Esencialmente, es la forma en que Microsoft presenta sus extensiones C ++ para que no entren en conflicto con futuras extensiones del estándar C ++. 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 / epílogo (para manejadores de interrupciones, código incrustable, etc.), __declspec (hilo) hace un hilo local variable, y así sucesivamente.
La lista completa de los atributos __declspec está disponible en MSDN y varía según la versión y la plataforma del compilador.
GCC 4.2, oferta alternativa que además de su __attribute__ ((dllexport))a __declspec(dllexport), ¿es justo a la llamada __declspec, un Microsoft-única extensión?
Sé que han pasado ocho años, pero quería compartir este código que se encuentra en MRuby que muestra cómo se __declspec()puede usar al mismo nivel que el export keyword.
/** Declare a public MRuby API function. */
#if defined(MRB_BUILD_AS_DLL)
#if defined(MRB_CORE) || defined(MRB_LIB)
# define MRB_API __declspec(dllexport)
#else
# define MRB_API __declspec(dllimport)
#endif
#else
# define MRB_API extern
#endif
__declspec(dllexport)antes de cada función en su biblioteca