Microsoft 专用
以下规则和限制适用于裸功能:
return 语句是不允许的。
,因为它们必须位于堆栈帧中,展开结构化异常处理和 C++ 异常处理构造是不允许的。
出于相同的原因, setjmp 的所有窗体禁止。
为 _alloca 使用函数禁止。
若要确保局部变量的初始化代码不在序言顺序出现之前,初始化的局部变量不允许在函数范围。具体而言, C++ 对象的声明中不允许在函数范围。可能,但是,在嵌套的大小初始化的数据。
优化的帧指针 (/Oy 编译器选项) 不建议使用,但是,它为 naked 函数自动取消。
不能声明 C++ 类对象在函数的词法范围。可以,但是,在声明嵌套的对象块。
,在使用编译 /clr时, naked 关键字被忽略。
为 __fastcall 裸功能,,二者在 C/C++ 代码的一对之一注册参数,序言码应存储该注册的值赋给该变量的堆栈位置。例如:
// nkdfastcl.cpp
// compile with: /c
// processor: x86
__declspec(naked) int __fastcall power(int i, int j) {
// calculates i^j, assumes that j >= 0
// prolog
__asm {
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
// store ECX and EDX into stack locations allocated for i and j
mov i, ecx
mov j, edx
}
{
int k = 1; // return value
while (j-- > 0)
k *= i;
__asm {
mov eax, k
};
}
// epilog
__asm {
mov esp, ebp
pop ebp
ret
}
}