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

Mit diesen Optionen wird festgelegt, in welcher Reihenfolge die Funktionsargumente auf den Stapel verschoben werden, ob die aufrufende oder die aufgerufene Funktion die Argumente am Ende des Aufrufs aus dem Stapel entfernt, und welche Namensergänzungskonvention der Compiler zur Erkennung einzelner Funktionen verwendet.

Syntax

/Gd
/Gr
/Gv
/Gz

Hinweise

/Gdgibt die Standardeinstellung die __cdecl Aufrufkonvention für alle Funktionen mit Ausnahme von C++-Memberfunktionen und -funktionen an, die als __stdcall, __fastcall oder __vectorcall gekennzeichnet sind.

/Gr Gibt die __fastcall Aufrufkonvention für alle Funktionen mit Ausnahme von C++-Memberfunktionen, Benannten mainFunktionen und Funktionen an, die gekennzeichnet __cdeclsind, __stdcalloder __vectorcall. Alle __fastcall-Funktionen müssen Prototypen haben. Diese Aufrufkonvention ist nur in Compilern verfügbar, die auf x86 abzielen, und wird von Compilern ignoriert, die auf andere Architekturen abzielen.

/Gz Gibt die __stdcall Aufrufkonvention für alle Funktionen mit Ausnahme von C++-Memberfunktionen, Benannten mainFunktionen und Funktionen an, die gekennzeichnet __cdeclsind, __fastcalloder __vectorcall. Alle __stdcall-Funktionen müssen Prototypen haben. Diese Aufrufkonvention ist nur in Compilern verfügbar, die auf x86 abzielen, und wird von Compilern ignoriert, die auf andere Architekturen abzielen.

/Gv Gibt die __vectorcall Aufrufkonvention für alle Funktionen mit Ausnahme von C++-Memberfunktionen, Funktionen namens main, Funktionen mit einer vararg Variablenargumentliste oder Funktionen an, die mit einem konfliktierenden __cdecl, __stdcalloder __fastcall Attribut gekennzeichnet sind. Diese Aufrufkonvention ist nur auf x86- und x64-Architekturen verfügbar, die „/arch:SSE2“ und höher unterstützen, und wird von Compilern ignoriert, die auf die ARM-Architektur abzielen.

Funktionen, die eine variable Anzahl von Argumenten akzeptieren, müssen mit __cdecl gekennzeichnet sein.

/Gd, /Grund sind nicht kompatibel mit /clr:safe oder /clr:pure./Gz/Gv Die Compileroptionen /clr:pure und /clr:safe sind in Visual Studio 2015 veraltet und werden in Visual Studio 2017 und höher nicht unterstützt.

Hinweis

Standardmäßig werden für x86-Prozessoren C++-Memberfunktionen verwendet __thiscall.

Für alle Prozessoren verwendet eine Memberfunktion, die explizit als __cdecl, __fastcall, __vectorcall oder __stdcall gekennzeichnet ist, die angegebene Aufrufkonvention, wenn diese nicht auf dieser Architektur ignoriert wird. Eine Memberfunktion, die eine variable Anzahl von Argumenten zulässt, verwendet immer die Aufrufkonvention __cdecl.

Diese Compileroptionen haben keine Auswirkungen auf die Namensergänzung von C++-Methoden und -Funktionen. Sofern sie nicht als extern "C" deklariert sind, kommt für C++-Methoden und -Funktionen ein anderes Schema für Namensergänzungen zur Anwendung. Weitere Informationen finden Sie unter Ergänzte Namen.

Weitere Informationen zu Aufrufkonventionen finden Sie unter Calling Conventions (Aufrufkonventionen).

__cdecl-Besonderheiten

Auf x86-Prozessoren werden alle Funktionsargumente auf dem Stapel von rechts nach links übergeben. Auf ARM- und x64-Architekturen werden einige Argumente nach Register übergeben und der Rest wird auf dem Stapel von rechts nach links übergeben. Die Aufrufroutine ruft die Argumente vom Stapel auf.

Für C verwendet die __cdecl-Benennungskonvention den Funktionsnamen mit einem führenden Unterstrich (_); Groß-/Kleinbuchstaben werden nicht umgewandelt. Sofern sie nicht als extern "C" deklariert sind, kommt für C++-Funktionen ein anderes Schema für Namensergänzungen zur Anwendung. Weitere Informationen finden Sie unter Ergänzte Namen.

__fastcall-Besonderheiten

Einige der Argumente einer __fastcall-Funktion werden an Register übergeben (für x86-Prozessoren, ECX und EDX), der Rest wird von rechts nach links auf den Stapel verschoben. Die aufgerufene Routine nimmt diese Argumente vor ihrem Rücksprung vom Stapel auf. Normalerweise verringert /Gr die Ausführungszeit.

Hinweis

Seien Sie vorsichtig, wenn Sie die __fastcall-Aufrufkonvention für eine in Inlineassemblysprache geschriebene Funktion verwenden. Es kann zu Konflikten zwischen Ihrer Verwendung von Registern und deren Verwendung durch den Compiler kommen.

Für C verwendet die __fastcall-Benennungskonvention den Funktionsnamen, mit einem führenden at-Zeichen (@), gefolgt von der Größe der Funktionsargumente in Byte. Groß-/Kleinbuchstaben werden nicht umgewandelt. Der Compiler verwendet für die Benennungskonvention diese Vorlage:

@function_name@number

Mit der Benennungskonvention __fastcall sollten Sie die standardmäßigen Includedateien verwenden. Andernfalls erhalten Sie nicht aufgelöste externe Verweise.

__stdcall-Besonderheiten

Die Argumente einer __stdcall-Funktion werden von rechts nach links auf dem Stapel abgelegt, und die aufgerufene Funktion nimmt diese Argumente vor ihrer Rücksetzung vom Stapel.

Für C verwendet die __stdcall Benennungskonvention den Funktionsnamen vor einem Unterstrich (_) und gefolgt von einem At-Zeichen (@) und der Größe der Argumente der Funktion in Byte. Groß-/Kleinbuchstaben werden nicht umgewandelt. Der Compiler verwendet für die Benennungskonvention diese Vorlage:

_functionname@number

__vectorcall-Besonderheiten

Die ganzzahligen Argumente einer __vectorcall Funktion werden nach Wert übergeben, wobei bis zu zwei (auf x86) oder vier (auf x64) ganzzahligen Registern und bis zu sechs XMM-Registern für Gleitkomma- und Vektorwerte verwendet werden und der Rest vom Stapel von rechts nach links übergeben wird. Die aufgerufene Funktion bereinigt den Stapel vor dem Zurückgeben. Vektor- und Gleitkomma-Rückgabewerte werden in XMM0 zurückgegeben.

Für C verwendet die __vectorcall-Benennungskonvention den Funktionsnamen, gefolgt von zwei at-Zeichen (@@)und der Größe der Funktionsargumente in Byte. Groß-/Kleinbuchstaben werden nicht umgewandelt. Der Compiler verwendet für die Benennungskonvention diese Vorlage:

functionname@@number

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Wählen Sie die Seite "Konfigurationseigenschaften>C/C++>Advanced" aus.

  3. Ändern Sie die Eigenschaft Aufrufkonvention.

So legen Sie diese Compileroption programmgesteuert fest

Siehe auch