共用方式為


Naked 函式的規則和限制

Microsoft 特定的

下列規則和限制適用於 naked 函式:

  • 不允許使用 return 陳述式。

  • 不允許結構化例外狀況處理和 C++ 例外狀況處理建構,因為它們必須跨堆疊框架回溯。

  • 基於相同理由,亦不得使用任何形式的 setjmp

  • 禁止使用 _alloca 函式。

  • 為確保初構序列之前不會出現區域變數的初始化程式碼,函式範圍不可使用初始化的區域變數。 尤其不允許在函式範圍宣告 C++ 物件。 不過,巢狀範圍中可以有初始化資料。

  • 不建議使用框架指標最佳化 (/Oy 編譯器選項),但 naked 函式會自動隱藏此最佳化。

  • 您不能在函式語彙範圍宣告 C++ 類別物件。 不過,您可以在巢狀區塊中宣告物件。

  • 使用 /clr 編譯時會忽略 naked 關鍵字。

  • 對於 __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
   }
}

請參閱

參考

Naked 函式呼叫