__cdecl
__cdecl
ist die Standardanrufkonvention für C- und C++-Programme. Da der Stapel vom Aufrufer sauber wird, kann er Funktionen ausführenvararg
. Die __cdecl
Aufrufenskonvention erstellt größere ausführbare Dateien als __stdcall, da jeder Funktionsaufruf Stapel-sauber up-Code enthält. Die folgende Liste zeigt die Implementierung dieser Aufrufkonvention. Der __cdecl
Modifizierer ist microsoftspezifisch.
Element | Implementierung |
---|---|
Reihenfolge der Argumentübergabe | Von rechts nach links. |
Stapelwartungszuständigkeit | Aufgerufene Funktion ruft die Argumente vom Stapel auf. |
Namensergänzungskonvention | Unterstrichzeichen (_) wird Namen vorangestellt, es sei denn, __cdecl Funktionen, die C-Verknüpfung verwenden, werden exportiert. |
Konvention zur Umwandlung von Groß- in Kleinbuchstaben und umgekehrt | Groß-/Kleinbuchstaben werden nicht umgewandelt. |
Hinweis
Verwandte Informationen finden Sie unter "Versehene Namen".
Platzieren Sie den __cdecl
Modifizierer vor einer Variablen oder einem Funktionsnamen. Da die C-Benennungs- und Aufrufkonventionen die Standardeinstellung sind, ist die einzige Zeit, die Sie in x86-Code verwenden __cdecl
müssen, wenn Sie die /Gv
Compileroption (Vectorcall), /Gz
(stdcall) oder /Gr
(fastcall) angegeben haben. Die /Gd-Compileroption erzwingt die __cdecl
Aufrufkonvention.
Auf ARM- und x64-Prozessoren wird sie akzeptiert, __cdecl
wird jedoch in der Regel vom Compiler ignoriert. Gemäß der Konvention zu ARM und x64 werden Argumente in Register übergeben, wenn dies möglich ist, und darauf folgende Argumente werden auf den Stapel übergeben. Verwenden Sie __cdecl
in x64-Code, um die Compileroption /Gv außer Kraft zu setzen und die standardmäßige x64-Aufrufkonvention zu verwenden.
Wenn die Funktion bei nicht statischen Klassenfunktionen abweichend definiert ist, muss der Aufrufkonventionsmodifizierer nicht in der abweichenden Definition angegeben werden. Das bedeutet, dass für nicht statische Membermethoden der Klasse zum Zeitpunkt der Definition die während der Deklaration angegebene Aufrufkonvention angenommen wird. Bei dieser Klassendefinition:
struct CMyClass {
void __cdecl mymethod();
};
hinzuzufügen. Die Bot-Endpunkt-URL sieht in der Regel so aus:
void CMyClass::mymethod() { return; }
entspricht:
void __cdecl CMyClass::mymethod() { return; }
Zur Kompatibilität mit früheren Versionen sind cdecl und _cdecl ein Synonym, __cdecl
es sei denn, die Compileroption /Za (Spracherweiterungen deaktivieren) ist angegeben.
Beispiel
Im folgenden Beispiel wird der Compiler angewiesen, C-Namenskonventionen und C-Aufrufkonventionen für die system
-Funktion zu verwenden.
// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für