Dela via


/Gd, /Gr, /Gv, /Gz (samtalskonvention)

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, __stdcalleller __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, __fastcalleller __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 __cdeclstår i konflikt med , __stdcalleller __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 __thiscallC++ medlemsfunktioner .

För alla processorer använder en medlemsfunktion som uttryckligen är markerad som __cdecl, __fastcall, __vectorcalleller __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

  1. Öppna dialogrutan egenskapssidor för projektet. Mer information finns i Ange C++-kompilator- och byggegenskaper i Visual Studio.

  2. Välj egenskapssidan Konfigurationsegenskaper>C/C++>Avancerat .

  3. Ändra egenskapen Calling Convention .

Så här ställer du in det här kompilatoralternativet programmatiskt

Se även