规则和限制裸的功能

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
   }
}

请参见

参考

裸函数调用