naked (C++)
Específicos de Microsoft
Para las funciones declaradas con el atributo naked, el compilador genera código sin código de prólogo y epílogo. Puede utilizar esta característica para escribir sus propias secuencias de código de prólogo/epílogo mediante código del ensamblador alineado. Las funciones naked son especialmente útiles al escribir controladores de dispositivos virtuales. Tenga en cuenta que el atributo naked solo es válido en x86 y ARM, y no está disponible en x64.
__declspec(naked) declarator
Comentarios
Puesto que el atributo naked solo es pertinente para la definición de una función y no es un modificador de tipo, las funciones naked deben utilizar la sintaxis de atributo extendido y la palabra clave __declspec.
El compilador no puede generar una función insertada para una función marcada con el atributo naked, incluso aunque la función esté marcada también con la palabra clave __forceinline.
El compilador emite un error si el atributo naked se aplica a algo distinto de la definición de un método que no es miembro.
Ejemplos
En este código se define una función con el atributo naked:
__declspec( naked ) int func( formal_parameters ) {}
O bien, como alternativa:
#define Naked __declspec( naked )
Naked int func( formal_parameters ) {}
El atributo naked solo afecta a la naturaleza de la generación de código del compilador para las secuencias de prólogo y epílogo de la función. No afecta al código que se genera para llamar a esas funciones. Por tanto, el atributo naked no se considera parte del tipo de la función y los punteros a función no pueden tener el atributo naked. Además, el atributo naked no se puede aplicar a una definición de datos. Por ejemplo, en este ejemplo de código se genera un error:
__declspec( naked ) int i; // Error--naked attribute not
// permitted on data declarations.
El atributo naked solo es pertinente para la definición de la función y no se puede especificar en el prototipo de la función. Por ejemplo, esta declaración genera un error del compilador:
__declspec( naked ) int func(); // Error--naked attribute not
// permitted on function declarations
Específicos de Microsoft: END