規則與限制 Naked 函式
Microsoft 專有的
下列規則和限制套用於 naked 函式:
return陳述式不被允許。
結構化例外處理和 C++ 例外處理建構不會受到允許,因為它們必須回溯堆疊框架上。
同樣地,也就是任何形式的setjmp反之則禁止使用。
使用**_alloca**函式禁止。
若要確保本機變數未初始化程式碼會出現在初構序列之前,在函式範圍內不允許初始化的區域變數。 特別是,C++ 物件的宣告不允許在函式的範圍。 可能,不過,有初始化的資料中巢狀的範圍內。
不建議框架指標最佳化 (/Oy 編譯器選項),但它會自動隱藏 naked 函式。
您不能宣告在函式的語彙範圍的 C++ 類別物件。 您可以,不過,宣告巢狀區塊中的物件。
naked關鍵字會被忽略,以編譯時 /clr。
對於 __fastcall naked 函式,只要在其中一個暫存器引數的 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
}
}