__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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour