Pravidla a omezení pro holé funkce
Konkrétní společnosti Microsoft
Holé funkcí platí následující pravidla a omezení:
return Příkaz není povoleno.
Strukturované zpracování výjimek a zpracování výjimek C++ konstrukce není povoleno, protože se musí unwind přes snímek zásobníku.
Ze stejného důvodu jakékoli formy setjmp je zakázáno.
Použít _alloca funkce je zakázáno.
Chcete-li zajistit, že žádný inicializační kód pro lokální proměnné se zobrazí před sekvence prolog, inicializovat místní proměnné není povoleno úrovni funkce.Prohlášení objektů C++, není povoleno úrovni funkce.Vnořené oboru může být však inicializovat data.
Ukazatel Optimalizace snímků (volba kompilátoru /Oy) se nedoporučuje, ale je automaticky potlačeny holé funkce.
Nelze deklarovat třídu objektů C++ na lexikální rozsah funkce.Můžete však deklarovat objekty vnořené bloku.
naked Klíčové slovo ignorováno při kompilaci s /clr.
Pro __fastcall holé funkce, kdykoli existuje odkaz v kódu C/C++ pro jeden z argumentů rejstříku, prolog kódu by měla být uložena hodnoty registru do umístění zásobníku pro tuto proměnnou.Příklad:
// 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
}
}