4.4.1b Especificadores opcionales
§1 Sinopsis
Aunque no se trata de características estándar del lenguaje, incluimos aquí algunas particularidades relativas al compilador MS Visual C++, que (por compatibilidad) también existen en el homólogo de Borland [1].
§2 __declspec( )
Se trata de una palabra clave (
3.2.1), específica de los mencionados compiladores
, que es además un
especificador de tipo de almacenamiento aplicable a la declaración de funciones
y variables. Por ejemplo, en la declaración de clases.
Sintaxis
__declspec( <modificador> )
Ejemplo
class __declspec(dllimport) X { };
extern "C" __declspec(dllexport) double funcion();
Comentario
<modificador> puede ser
alguno de los siguientes:
dllexport | Sintaxis: __declspec( dllexport ) declarador Este atributo define la interface entre una función, variable, u
objeto de una librería de enlazado dinámico .DLL ( La declaración de funciones con este atributo elimina la necesidad
de declarar un fichero de definición (.DEF) del módulo que contiene
a la función. Al menos en lo relativo a la especificación de
funciones exportables. Ver ejemplo ( |
dllimport | Sintaxis: __declspec( dllimport ) declarador Este atributo permite importar funciones, datos u objetos situados en una librería de enlace dinámico (DLL) desde otro
ejecutable ( Nota: dllimport reemplaza la palabra clave __import. |
naked | Sintaxis: __declspec( naked ) declarator El atributo naked es aplicable solo a la definición de una función, y no supone un modificador de tipo. Su utilización origina la supresión del código de prólogo y epílogo (de ahí su nombre de funciones "desnudas"). Lo que causa a su vez que al ser invocada la función no se construya marco de pila de forma estándar. La función no preserva los valores de los registros como es usual, y es responsabilidad del programador conformar las convenciones que necesite el invocador de la función. Esta posibilidad suele utilizarse junto con código de prólogo y epílogo de cosecha propia en ensamblador (). Las funciones desnudas son especialmente adecuadas cuando hay que escribir manejadores de dispositivos virtuales ("Virtual device drivers"). Ejemplo: __declspec( naked ) int funcion( parametros-formales ) { |
noreturn | Sintaxis: __declspec( noreturn ) declarador Este atributo se utiliza para informar al compilador que una función no tiene retorno. Como consecuencia, el compilador es informado que el código que siga a la invocación de dicha función no puede ser ejecutado. La justificación de este atributo hay que buscarlo en que el compilador dispone de un mecanismo controlador de la senda de
ejecución. Este mecanismo genera un mensaje de aviso ("Warning"
El Estándar define dos funciones que no tienen retorno, son las funciones abort
( Ejemplo: considere el código siguiente en el que la segunda cláusula else no contiene una sentencia return y la declaración de func1 como noreturn (sin retorno) para prevenir el error. __declspec( noreturn ) extern void func1 () { Nota: este especificador noreturn no está recogido en el Estándar Ansi C++. Aunque los compiladores Borland; GNU cpp y MS Visual C++ lo utilizan. |
nothrow | Sintaxis: __declspec( nothrow ) declarador Este atributo se utiliza exclusivamente en la declaración de
funciones, y sirve para informar al compilador que la función así
declarada, y las que puedan ser invocadas por ella, no lanzan nunca
una excepción ( Ejemplo: las tres declaraciones que siguen son equivalentes: #define WINAPI __declspec(nothrow) __stdcall Las formas F1 y F2 presentan la ventaja de que puede utilizarse
una definición de la API (de Windows) con la que puede especificarse
fácilmente la característica nothrow para una serie de
funciones. Por su parte F3 es la forma "canónica" de
C++ ( |
novtable | Sintaxis: __declspec( novtable ) declarador Este especificador solo es aplicable a la declaración de clases,
aunque solo es aplicable a clases que sean pura interfaz ( En realidad la labor de este especificador consiste en informar al
compilador que en la definición de constructores y destructores no
genere el código necesario para inicializar el puntero a la tabla de
funciones virtuales (vfptr |
property | |
selectany | Sintaxis: __declspec( selectany ) declarador Los datos globales ( Nota: este atributo solo puede usarse en la inicialización de datos globales que sean visibles externamente. |
thread | |
uuid |
[1] Creemos que la abrumadora preponderancia de la plataforma Wintel en el panorama de la informática actual, hace innecesaria cualquier justificación respecto a la importancia de estas "particularidades".