c++ - ¿Qué significa realmente__declspec(dllimport)?
qt visual-c++ (3)
Significa que la definición de la función está en una biblioteca dinámica. Consulte la documentación para obtener más detalles y ejemplos.
Vi el código fuente de Qt así:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
¿ Q_CORE_EXPORT
macro Q_CORE_EXPORT
define como a continuación?
define Q_DECL_IMPORT __declspec(dllimport)
Entonces, ¿qué significa __declspec(dllimport)
?
__declspec
es un atributo específico de Microsoft que le permite especificar información de clase de almacenamiento.
(Nitpicker''s Corner: Sin embargo, varios otros proveedores de compiladores, por ejemplo, GCC, ahora admiten esta extensión de idioma para la compatibilidad con la base de código instalada escrita para los compiladores de Microsoft. Algunos incluso proporcionan atributos adicionales de clase de almacenamiento).
Dos de esos atributos de clase de almacenamiento que se pueden especificar son dllimport
y dllexport
. Estos indican al compilador que una función u objeto se importa o se exporta (respectivamente) desde una DLL.
Más específicamente, definen la interfaz del DLL para el cliente sin requerir un archivo de definición de módulo ( .DEF
). A la mayoría de las personas les resulta mucho más fácil usar estas extensiones de lenguaje que crear archivos DEF.
Por razones obvias, __declspec(dllimport)
y __declspec(dllexport)
generalmente se __declspec(dllexport)
entre sí. Utiliza dllexport
para marcar un símbolo como exportado desde una DLL, y utiliza dllimport
para importar ese símbolo exportado en otro archivo.
Debido a esto, y debido a que el mismo archivo de encabezado generalmente se usa tanto al compilar el DLL como en el código del cliente que consume la interfaz del DLL, es un patrón común definir una macro que resuelva automáticamente al especificador de atributo apropiado en tiempo de compilación. Por ejemplo:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Y luego marcar todos los símbolos que deberían exportarse con DLLEXPORT
.
Presumiblemente, eso es lo que hace la macro Q_CORE_EXPORT
, resolviendo Q_DECL_IMPORT
o Q_DECL_EXPORT
.
__declspec(dllimport)
es un especificador de clase de almacenamiento que le dice al compilador que una función u objeto o tipo de datos se define en una DLL externa.
La función u objeto o tipo de datos se exporta desde una DLL con la correspondiente __declspec(dllexport)
.