__cdecl

__cdecl est la convention d’appel par défaut pour les programmes C et C++. Étant donné que la pile est propre mise en place par l’appelant, elle peut effectuer vararg des fonctions. La __cdecl convention d’appel crée des exécutables plus volumineux que __stdcall, car il nécessite que chaque appel de fonction inclue le code de pile propre up. La liste suivante illustre l'implémentation de cette convention d'appel. Le __cdecl modificateur est spécifique à Microsoft.

Élément Implémentation
Ordre de transmission des arguments De droite à gauche
Responsabilité de la maintenance de la pile La fonction appelante enlève les arguments de la pile.
Convention de décoration de nom Le caractère de soulignement (_) est précédé de noms, sauf lorsque __cdecl fonctions qui utilisent la liaison C sont exportées.
Convention de conversion de casse Aucune conversion de casse n'est effectuée.

Remarque

Pour plus d’informations, consultez Noms décorés.

Placez le __cdecl modificateur avant une variable ou un nom de fonction. Étant donné que les conventions d’affectation de noms et d’appel C sont les conventions par défaut, la seule fois que vous devez utiliser __cdecl dans le code x86 est lorsque vous avez spécifié l’option /Gv de compilateur (vectorcall), /Gz (stdcall) ou /Gr (fastcall). L’option du compilateur /Gd force la convention d’appel __cdecl .

Sur les processeurs ARM et x64, __cdecl il est accepté mais généralement ignoré par le compilateur. Par convention sur ARM et x64, les arguments sont passés dans les registres le cas échéant, et les arguments suivants sont passés sur la pile. Dans le code x64, utilisez cette option __cdecl pour remplacer l’option du compilateur /Gv et utiliser la convention d’appel x64 par défaut.

Pour les fonctions de classe non statiques, si la fonction est définie hors ligne, il n’est pas nécessaire de spécifier le modificateur de convention d’appel dans la définition hors ligne. En d’autres termes, pour les méthodes membres non statiques de classe, la convention d’appel spécifiée dans le cadre de la déclaration est utilisée par défaut au stade de la définition. Compte tenu de la définition de classe suivante :

struct CMyClass {
   void __cdecl mymethod();
};

le code suivant :

void CMyClass::mymethod() { return; }

équivaut au code :

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

Pour la compatibilité avec les versions précédentes, cdecl et _cdecl sont synonymes, __cdecl sauf si l’option du compilateur /Za (Désactiver les extensions de langage) est spécifiée.

Exemple

Dans l’exemple suivant, le compilateur est chargé d’utiliser les conventions de nommage et d’appel du langage C pour la fonction system.

// 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, ...);

Voir aussi

Passage des arguments et conventions de dénomination
Mots clés