/Gd, /Gr, /Gv, /Gz (Konwencja wywoływania)
Te opcje określają kolejność, w jakiej argumenty funkcji są wypychane do stosu, niezależnie od tego, czy funkcja wywołująca, czy wywoływana funkcja usuwa argumenty ze stosu na końcu wywołania, oraz konwencję dekorowania nazw używaną przez kompilator do identyfikowania poszczególnych funkcji.
Składnia
/Gd
/Gr
/Gv
/Gz
Uwagi
/Gd
, ustawienie domyślne określa konwencję wywoływania __cdecl dla wszystkich funkcji z wyjątkiem funkcji składowych i funkcji języka C++, które są oznaczone __stdcall, __fastcall lub __vectorcall.
/Gr
określa konwencję __fastcall
wywoływania dla wszystkich funkcji z wyjątkiem funkcji składowych języka C++, funkcji o nazwach main
i funkcji oznaczonych jako __cdecl
, __stdcall
lub __vectorcall
. Wszystkie __fastcall
funkcje muszą mieć prototypy. Ta konwencja wywoływania jest dostępna tylko w kompilatorach przeznaczonych dla architektury x86 i jest ignorowana przez kompilatory przeznaczone dla innych architektur.
/Gz
określa konwencję __stdcall
wywoływania dla wszystkich funkcji z wyjątkiem funkcji składowych języka C++, funkcji o nazwach main
i funkcji oznaczonych jako __cdecl
, __fastcall
lub __vectorcall
. Wszystkie __stdcall
funkcje muszą mieć prototypy. Ta konwencja wywoływania jest dostępna tylko w kompilatorach przeznaczonych dla architektury x86 i jest ignorowana przez kompilatory przeznaczone dla innych architektur.
/Gv
Określa konwencję __vectorcall
wywoływania dla wszystkich funkcji z wyjątkiem funkcji składowych języka C++, funkcji o nazwie main
, funkcji z vararg
listą argumentów zmiennych lub funkcji oznaczonych z powodu konfliktu __cdecl
, __stdcall
lub __fastcall
atrybutu. Ta konwencja wywoływania jest dostępna tylko w architekturach x86 i x64, które obsługują /arch:SSE2 i nowsze, i są ignorowane przez kompilatory przeznaczone dla architektury arm.
Funkcje, które przyjmują zmienną liczbę argumentów, muszą być oznaczone jako __cdecl
.
/Gd
, /Gr
i nie są zgodne z /clr:safe
lub /clr:pure./Gz
/Gv
Opcje kompilatora /clr:pure i /clr:safe są przestarzałe w programie Visual Studio 2015 i nieobsługiwane w programie Visual Studio 2017 lub nowszym.
Uwaga
Domyślnie w przypadku procesorów x86 funkcje składowe języka C++ używają funkcji __thiscall
.
W przypadku wszystkich procesorów funkcja składowa, która jest jawnie oznaczona jako __cdecl
, __fastcall
__vectorcall
, lub __stdcall
używa określonej konwencji wywoływania, jeśli nie jest ignorowana w tej architekturze. Funkcja składowa, która przyjmuje zmienną liczbę argumentów, zawsze używa __cdecl
konwencji wywoływania.
Te opcje kompilatora nie mają wpływu na dekorację nazw metod i funkcji języka C++. Jeśli nie zostanie zadeklarowany jako extern "C"
, metody i funkcje języka C++ używają innego schematu dekorowania nazw. Aby uzyskać więcej informacji, zobacz Nazwy ozdobione.
Aby uzyskać więcej informacji na temat wywoływania konwencji, zobacz Konwencje wywoływania.
__cdecl specyfiki
Na procesorach x86 wszystkie argumenty funkcji są przekazywane na stos od prawej do lewej. W architekturach ARM i x64 niektóre argumenty są przekazywane przez rejestr, a pozostałe są przekazywane na stos od prawej do lewej. Procedury wywoływania popsuje argumenty ze stosu.
W przypadku języka __cdecl
C konwencja nazewnictwa używa nazwy funkcji poprzedzonej znakiem podkreślenia ( _
); nie jest wykonywane tłumaczenie wielkości liter. O ile nie zostanie zadeklarowana jako extern "C"
, funkcje języka C++ używają innego schematu dekorowania nazw. Aby uzyskać więcej informacji, zobacz Nazwy ozdobione.
__fastcall specyfiki
__fastcall
Niektóre argumenty funkcji są przekazywane w rejestrach (dla procesorów x86, ECX i EDX), a pozostałe są wypychane do stosu od prawej do lewej. Wywołana rutyna powoduje wyskakujące te argumenty ze stosu, zanim zwróci. Zazwyczaj /Gr zmniejsza czas wykonywania.
Uwaga
Należy zachować ostrożność podczas używania __fastcall
konwencji wywoływania dla każdej funkcji napisanej w wbudowanym języku zestawu. Użycie rejestrów może powodować konflikt z użyciem kompilatora.
W przypadku języka C __fastcall
konwencja nazewnictwa używa nazwy funkcji poprzedzonej znakiem (@), a następnie rozmiarem argumentów funkcji w bajtach. Tłumaczenie wielkości liter nie jest wykonywane. Kompilator używa tego szablonu do konwencji nazewnictwa:
@function_name@number
W przypadku korzystania z konwencji nazewnictwa należy użyć __fastcall
standardowych plików dołączania. W przeciwnym razie otrzymasz nierozwiązane odwołania zewnętrzne.
__stdcall specyfiki
__stdcall
Argumenty funkcji są wypychane do stosu od prawej do lewej, a wywołana funkcja wyskakuje te argumenty ze stosu przed zwróceniem.
W przypadku języka C __stdcall
konwencja nazewnictwa używa nazwy funkcji poprzedzonej znakiem podkreślenia (_) i znakiem at (@) oraz rozmiarem argumentów funkcji w bajtach. Nie jest wykonywane tłumaczenie wielkości liter. Kompilator używa tego szablonu do konwencji nazewnictwa:
_functionname@number
__vectorcall specyfiki
__vectorcall
Argumenty całkowite funkcji są przekazywane przez wartość, używając maksymalnie dwóch (na x86) lub czterech (na x64) rejestrów liczb całkowitych, a do sześciu rejestrów XMM dla wartości zmiennoprzecinkowych i wektorowych, a pozostałe są przekazywane na stos od prawej do lewej. Wywołana funkcja czyści stos przed zwróceniem. Wartości zwracane wektorów i zmiennoprzecinkowych są zwracane w programie XMM0.
W przypadku języka C __vectorcall
konwencja nazewnictwa używa nazwy funkcji, po której następują dwa znaki (@@) i rozmiar argumentów funkcji w bajtach. Nie jest wykonywane tłumaczenie wielkości liter. Kompilator używa tego szablonu do konwencji nazewnictwa:
functionname@@number
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę Właściwości>konfiguracji C/C++>Advanced.
Zmodyfikuj właściwość Konwencji wywoływania.
Aby programowo ustawić tę opcję kompilatora
- Zobacz: CallingConvention.