/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 main
a funkcí, které jsou označeny __cdecl
, __stdcall
nebo __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 main
a funkcí, které jsou označeny __cdecl
, __fastcall
nebo __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
, __stdcall
nebo __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
, /Gr
a /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
__vectorcall
nebo __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
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Vyberte stránku vlastností konfigurace>C/C++>Advanced.
Upravte vlastnost Call Convention.
Programové nastavení tohoto parametru kompilátoru
- Viz třída CallingConvention.