Freigeben über


__cdecl

Microsoft-spezifisch

__cdecl ist die Standardaufrufkonvention für C- und C++-Programme. Da der Stapel vom Aufrufer bereinigt wird, kann er vararg-Funktionen ausführen. Die __cdecl-Aufrufkonvention erstellt größere ausführbare Dateien als __stdcall, da hier jeder Funktionsaufruf Stapelbereinigungscode enthalten muss. Die folgende Liste zeigt die Implementierung dieser Aufrufkonvention.

Element

Implementierung

Reihenfolge der Argumentübergabe

Von rechts nach links.

Stapelwartungszuständigkeit

Aufgerufene Funktion ruft die Argumente vom Stapel auf.

Namensergänzungskonvention

Der Unterstrich (_) wird Namen vorangestellt, außer beim Exportieren von __cdecl-Funktionen, die eine C-Bindung verwenden.

Konvention zur Umwandlung von Groß- in Kleinbuchstaben und umgekehrt

Groß-/Kleinbuchstaben werden nicht umgewandelt.

Hinweis

Verwandte Informationen finden Sie unter Ergänzte Namen.

Platzieren Sie den __cdecl-Modifizierer vor einer Variablen oder einem Funktionsnamen. Da C-Benennungs- und C-Aufrufkonventionen die Standardeinstellung sind, müssen Sie in x86-Code __cdecl nur verwenden, wenn Sie die Compileroption /Gv (vectorcall), /Gz (stdcall) oder /Gr (fastcall) angegeben haben. Mit der /Gd-Compileroption wird die __cdecl-Aufrufkonvention erzwungen.

Auf ARM- und x64-Prozessoren wird __cdecl zwar vom Compiler akzeptiert, aber normalerweise 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 in x64-Code __cdecl, um die Compileroption /Gv zu überschreiben, und verwenden Sie die standardmäßige x64-Aufrufkonvention.

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();
};

entspricht:

void CMyClass::mymethod() { return; }

folgendem:

void __cdecl CMyClass::mymethod() { return; }

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

Referenz

Argumentübergabe und Benennungskonventionen

C++-Schlüsselwörter