2010-02-17 18 views

Respuesta

52

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

__declspec (C++)

+7

Gracias - pero lo que iba a usar? –

+4

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. –

+1

@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

34

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)

+6

¿cómo sabes a qué dll dllimport está apuntando? – tetris

+2

@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. –

6

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.

+0

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

16

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.

10

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++)

Cuestiones relacionadas