Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
De här alternativen avgör i vilken ordning funktionsargumenten skickas till stacken, om anroparfunktionen eller den anropade funktionen tar bort argumenten från stacken i slutet av anropet och den namndekorationskonvention som kompilatorn använder för att identifiera enskilda funktioner.
Syntax
/Gd
/Gr
/Gv
/Gz
Anmärkningar
/Gd
, standardinställningen anger __cdecl anropande konvention för alla funktioner utom C++-medlemsfunktioner och funktioner som är markerade __stdcall, __fastcall eller __vectorcall.
/Gr
anger anropskonventionen __fastcall
för alla funktioner utom C++-medlemsfunktioner, funktioner med namnet main
, och funktioner som är märkta __cdecl
, __stdcall
eller __vectorcall
. Alla __fastcall
funktioner måste ha prototyper. Den här anropskonventionen är endast tillgänglig i kompilatorer som riktar sig mot x86 och ignoreras av kompilatorer som riktar in sig på andra arkitekturer.
/Gz
anger anropskonventionen __stdcall
för alla funktioner utom C++-medlemsfunktioner, funktioner med namnet main
, och funktioner som är märkta __cdecl
, __fastcall
eller __vectorcall
. Alla __stdcall
funktioner måste ha prototyper. Den här anropskonventionen är endast tillgänglig i kompilatorer som riktar sig mot x86 och ignoreras av kompilatorer som riktar in sig på andra arkitekturer.
/Gv
anger anropskonventionen __vectorcall
för alla funktioner utom C++-medlemsfunktioner, funktioner med namnet main
, funktioner med en vararg
variabel argumentlista eller funktioner som är markerade med ett attribut som __cdecl
står i konflikt med , __stdcall
eller __fastcall
. Den här anropskonventionen är endast tillgänglig för x86- och x64-arkitekturer som stöder /arch:SSE2 och senare, och ignoreras av kompilatorer som riktar in sig på ARM-arkitekturen.
Funktioner som tar ett variabelt antal argument måste markeras __cdecl
.
/Gd
, /Gr
, /Gv
och /Gz
är inte kompatibla med /clr:safe
eller /clr:pure. Alternativen /clr:pure och /clr:safe är inaktuella i Visual Studio 2015 och stöds inte i Visual Studio 2017 och senare.
Anmärkning
Som standard för x86-processorer använder __thiscall
C++ medlemsfunktioner .
För alla processorer använder en medlemsfunktion som uttryckligen är markerad som __cdecl
, __fastcall
, __vectorcall
eller __stdcall
den angivna anropskonventionen om den inte ignoreras i den arkitekturen. En medlemsfunktion som tar ett variabelt antal argument använder alltid anropskonventionen __cdecl
.
Dessa kompilatoralternativ har ingen effekt på namndekorationen för C++-metoder och -funktioner. Om de inte deklareras som extern "C"
använder C++-metoder och -funktioner ett annat namndekorationsschema. Mer information finns i Dekorerade namn.
Mer information om samtalskonventioner finns i Samtalskonventioner.
__cdecl Specifics
På x86-processorer skickas alla funktionsargument på stacken från höger till vänster. I ARM- och x64-arkitekturer skickas vissa argument av registret och resten skickas på stacken från höger till vänster. Anropsrutinen visar argumenten från stacken.
För C använder namngivningskonventionen __cdecl
funktionsnamnet som föregås av ett understreck (_
); ingen skiftlägesöversättning utförs. Om de inte deklareras som extern "C"
använder C++-funktioner ett annat namndekorationsschema. Mer information finns i Dekorerade namn.
__fastcall Specifics
Några av en __fastcall
funktions argument skickas i register (för x86-processorer, ECX och EDX), och resten skickas till stacken från höger till vänster. Den anropade rutinen visar dessa argument från stacken innan den returneras. Vanligtvis minskar /Gr körningstiden.
Anmärkning
Var försiktig när du använder __fastcall
anropskonventionen för alla funktioner som skrivs i infogat sammansättningsspråk. Din användning av register kan vara i konflikt med kompilatorns användning.
För C __fastcall
använder namngivningskonventionen funktionsnamnet som föregås av ett vid-tecken (@) följt av storleken på funktionens argument i byte. Ingen fallöversättning är klar. Kompilatorn använder den här mallen för namngivningskonventionen:
@function_name@number
När du använder namngivningskonventionen __fastcall
använder du inkluderingsfilerna som standard. Annars får du olösta externa referenser.
__stdcall Specifics
En __stdcall
funktions argument skickas till stacken från höger till vänster, och den anropade funktionen pops dessa argument från stacken innan den returneras.
För C __stdcall
använder namngivningskonventionen funktionsnamnet föregånget av ett understreck (_) och följt av ett vidtecken (@) och storleken på funktionens argument i byte. Ingen skiftlägesöversättning utförs. Kompilatorn använder den här mallen för namngivningskonventionen:
_functionname@number
__vectorcall-detaljer
En __vectorcall
funktions heltalsargument skickas efter värde med upp till två (på x86) eller fyra (på x64) heltalsregister och upp till sex XMM-register för flyttals- och vektorvärden, och resten skickas på stacken från höger till vänster. Den anropade funktionen rensar bort stacken innan den returneras. Vektor- och flyttalsreturvärden returneras i XMM0.
För C __vectorcall
använder namngivningskonventionen funktionsnamnet följt av två vid tecken (@@) och storleken på funktionens argument i byte. Ingen skiftlägesöversättning utförs. Kompilatorn använder den här mallen för namngivningskonventionen:
functionname@@number
Ange det här kompilatoralternativet i Visual Studio-utvecklingsmiljön
Öppna dialogrutan egenskapssidor för projektet. Mer information finns i Ange C++-kompilator- och byggegenskaper i Visual Studio.
Välj egenskapssidan Konfigurationsegenskaper>C/C++>Avancerat .
Ändra egenskapen Calling Convention .
Så här ställer du in det här kompilatoralternativet programmatiskt
- Se även CallingConvention.