Функции Naked
Блок, относящийся только к системам Майкрософт
Атрибут класса хранения naked
является расширением языка C для систем Microsoft. Код функций, объявленных с атрибутом naked
, создается компилятором без кода пролога и эпилога. Эту возможность можно использовать, чтобы создавать свой собственный код на языке ассемблера и вставлять его в качестве пролога и эпилога. Функции с атрибутом naked особенно полезны для написания драйверов виртуальных устройств.
Поскольку атрибут naked
относится только к определению функции и не является модификатором типа, в функциях с этим атрибутом используется расширенный синтаксис атрибутов, который описывается в статье Расширенные атрибуты классов хранения в C.
В следующем примере определяется функция с атрибутом naked
.
__declspec( naked ) int func( formal_parameters )
{
/* Function body */
}
Другой пример:
#define Naked __declspec( naked )
Naked int func( formal_parameters )
{
/* Function body */
}
Атрибут naked
влияет только на создание кода компилятора для последовательностей пролога и эпилога функции. Код, который создается для вызова таких функций, не зависит от этого атрибута. Таким образом, атрибут naked
не входит в тип функции, а указатели на функции не могут иметь атрибут naked
. Кроме того, атрибут naked
не может применяться к определениям данных. Например, следующий код вызывает ошибки:
__declspec( naked ) int i; /* Error--naked attribute not */
/* permitted on data declarations. */
Атрибут naked
относится только к определению функции и не может быть определен в прототипе функции. Следующее объявление создает ошибку компилятора:
__declspec( naked ) int func(); /* Error--naked attribute not */
/* permitted on function declarations. */ \
Завершение блока, относящегося только к системам Майкрософт