Share via


/Gd, /Gr, /Gv, /Gz (Konvence volání)

Tyto možnosti určují pořadí, ve kterém jsou argumenty funkce vloženy do zásobníku, ať už funkce volajícího nebo volané funkce odebere argumenty ze zásobníku na konci volání, a konvenci dekódování názvů, kterou kompilátor používá k identifikaci jednotlivých funkcí.

Syntaxe

/Gd
/Gr
/Gv
/Gz

Poznámky

/Gd, výchozí nastavení určuje __cdecl konvenci volání pro všechny funkce kromě členských funkcí jazyka C++, které jsou označeny __stdcall, __fastcall nebo __vectorcall.

/Gr určuje __fastcall konvenci volání pro všechny funkce kromě členských funkcí jazyka C++, funkcí pojmenovaných maina funkcí, které jsou označeny __cdecl, __stdcallnebo __vectorcall. Všechny __fastcall funkce musí mít prototypy. Tato konvence volání je k dispozici pouze v kompilátorech, které cílí na x86, a kompilátory, které cílí na jiné architektury.

/Gz určuje __stdcall konvenci volání pro všechny funkce kromě členských funkcí jazyka C++, funkcí pojmenovaných maina funkcí, které jsou označeny __cdecl, __fastcallnebo __vectorcall. Všechny __stdcall funkce musí mít prototypy. Tato konvence volání je k dispozici pouze v kompilátorech, které cílí na x86, a kompilátory, které cílí na jiné architektury.

/Gv určuje __vectorcall konvenci volání pro všechny funkce kromě členských funkcí jazyka C++, funkcí pojmenovaných main, funkcí se seznamem vararg argumentů proměnných nebo funkcí, které jsou označené konfliktním __cdecl, __stdcallnebo __fastcall atributem. Tato konvence volání je k dispozici pouze v architekturách x86 a x64, které podporují /arch:SSE2 a vyšší, a kompilátory, které cílí na architekturu ARM.

Funkce, které přebírají proměnný počet argumentů, musí být označeny __cdecl.

/Gd, /Gra /Gz nejsou kompatibilní s parametrem /clr:safe/clr:pure. /Gv Možnosti kompilátoru /clr:pure a /clr:safe jsou v sadě Visual Studio 2015 zastaralé a nejsou podporovány v sadě Visual Studio 2017 a novější.

Poznámka

Ve výchozím nastavení pro procesory x86 členské funkce jazyka C++ používají __thiscall.

Pro všechny procesory členská funkce, která je explicitně označena jako __cdecl, __fastcall__vectorcallnebo __stdcall používá zadanou konvenci volání, pokud není ignorována v této architektuře. Členská funkce, která přebírá proměnlivý počet argumentů, vždy používá __cdecl konvenci volání.

Tyto možnosti kompilátoru nemají žádný vliv na dekoraci názvů metod a funkcí jazyka C++. Pokud nejsou deklarovány jako extern "C"metody a funkce jazyka C++, používají jiné schéma dekorování názvů. Další informace naleznete v tématu Dekorované názvy.

Další informace o konvencích volání najdete v tématu Konvence volání.

specifika __cdecl

Na procesorech x86 se všechny argumenty funkce předávají v zásobníku zprava doleva. V architekturách ARM a x64 se některé argumenty předávají registrem a zbytek se předává v zásobníku zprava doleva. Volající rutina zobrazí argumenty ze zásobníku.

V případě jazyka C __cdecl používá konvence vytváření názvů název funkce před podtržítkem ( _ ); neprovádí se žádný překlad písmen. Pokud nejsou deklarovány jako extern "C"funkce jazyka C++, používají jiné schéma dekorování názvů. Další informace naleznete v tématu Dekorované názvy.

specifika __fastcall

Některé argumenty __fastcall funkce se předávají v registrech (pro procesory x86, ECX a EDX) a zbytek se vloží do zásobníku zprava doleva. Volané rutiny zobrazí tyto argumenty ze zásobníku předtím, než se vrátí. /Gr obvykle zkracuje dobu provádění.

Poznámka

Při použití __fastcall konvence volání pro libovolnou funkci napsanou v vložený jazyk sestavení buďte opatrní. Použití registrů může být v konfliktu s použitím kompilátoru.

V případě jazyka C __fastcall používá konvence vytváření názvů název funkce před znakem at (@) následovaný velikostí argumentů funkce v bajtech. Překlad případu není hotový. Kompilátor používá tuto šablonu pro konvenci pojmenování:

@function_name@number

Pokud použijete __fastcall konvenci vytváření názvů, použijte standardní soubory zahrnutí. V opačném případě se zobrazí nevyřešené externí odkazy.

specifika __stdcall

__stdcall Argumenty funkce se odsunou do zásobníku zprava doleva a volané funkce před vrácením zobrazí tyto argumenty ze zásobníku.

V případě jazyka C __stdcall používá konvence pojmenování název funkce před podtržítkem (_) a za ním znak@ () a velikost argumentů funkce v bajtech. Neprovádí se žádný překlad případu. Kompilátor používá tuto šablonu pro konvenci pojmenování:

_functionname@number

specifika __vectorcall

__vectorcall Celočíselné argumenty funkce se předávají hodnotou, používají až dva (x86) nebo čtyři celočíselné registry (v x64) a až šest registrů XMM pro hodnoty s plovoucí desetinou čárkou a vektory a zbytek se předává v zásobníku zprava doleva. Volané funkce před vrácením vyčistí zásobník. V XMM0 se vrátí návratové hodnoty vektorové a s plovoucí desetinou čárkou.

V případě jazyka C __vectorcall používá konvence pojmenování název funkce následovaný dvěma znaky at (@@) a velikost argumentů funkce v bajtech. Neprovádí se žádný překlad případu. Kompilátor používá tuto šablonu pro konvenci pojmenování:

functionname@@number

Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností konfigurace>C/C++>Advanced.

  3. Upravte vlastnost Call Convention.

Programové nastavení tohoto parametru kompilátoru

Viz také