Udostępnij za pośrednictwem


/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 maini funkcji oznaczonych jako __cdecl, __stdcalllub __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 maini funkcji oznaczonych jako __cdecl, __fastcalllub __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, __stdcalllub __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, /Gri 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

  1. 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).

  2. Wybierz stronę Właściwości>konfiguracji C/C++>Advanced.

  3. Zmodyfikuj właściwość Konwencji wywoływania.

Aby programowo ustawić tę opcję kompilatora

Zobacz też