/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.
/Gd
/Gr
/Gv
/Gz
Hinweise
Die Standardeinstellung /Gd legt für alle Funktionen die __cdecl-Aufrufkonvention fest, mit Ausnahme von C++-Memberfunktionen und Funktionen, die als __stdcall, __fastcall oder __vectorcall gekennzeichnet sind.
/Gr legt die __fastcall-Aufrufkonvention für alle Funktionen mit Ausnahme von C++-Memberfunktionen, main benannten Funktionen und mit __cdecl, __stdcall oder __vectorcall gekennzeichneten Funktionen fest. 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 legt die __stdcall-Aufrufkonvention für alle Funktionen mit Ausnahme von C++-Memberfunktionen, main benannten Funktionen und mit __cdecl, __fastcall oder __vectorcall gekennzeichneten Funktionen fest. 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 an, außer C++-Memberfunktionen, Funktionen mit der Bezeichnung "main", Funktionen mit einer Liste variabler Argumente vararg oder Funktionen, die mit einem widersprüchlichen __cdecl, __stdcall oder __fastcall-Attribut markiert 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, /Gr, /Gv und /Gz sind nicht mit /clr:safe oder /clr:pure kompatibel.
Hinweis
Für x86-Prozessoren verwenden C++-Memberfunktionen standardmäßig __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 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. /Gr verringert gewöhnlich 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 @-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 mit führendem Unterstrich (_), gefolgt von einem @-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
__vectorcall-Besonderheiten
Die ganzzahligen Argumente einer __vectorcall-Funktion werden nach Wert übergeben, wobei bis zu zwei (auf x86) oder vier (x64) Ganzzahlregister und bis zu sechs XMM-Register für Gleitkomma- und Vektorwerte verwendet werden. Der Rest wird auf dem Stapel von rechts nach links übergeben. 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 @-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