__stdcall
Section spécifique à Microsoft
La convention d'appel __stdcall sert à appeler des fonctions API Win32. L'appelé nettoie la pile, afin que le compilateur rende les fonctions varag __cdecl. Les fonctions qui utilisent cette convention d'appel requièrent un prototype de fonction.
return-type __stdcall function-name[(argument-list)]
Notes
La liste suivante illustre l'implémentation de cette convention d'appel.
Élément |
Implémentation |
---|---|
Ordre de transmission des arguments |
De droite à gauche |
Convention de passage d'argument |
Par valeur, à moins qu'un type pointeur ou référence soit passé. |
Responsabilité de la maintenance de la pile |
La fonction appelée enlève ses propres arguments de la pile. |
Convention de décoration de nom |
Un trait de soulignement (_) est ajouté en préfixe au nom. Le nom est suivi de l'arobase (@), suivi du nombre d'octets (au format décimal) dans la liste d'arguments. Par conséquent, la fonction déclarée comme int func( int a, double b ) est décorée comme suit : _func@12 |
Convention de conversion de casse |
Aucun |
L'option du compilateur /Gz spécifie __stdcall pour toutes les fonctions qui ne sont pas déclarées explicitement avec une autre convention d'appel.
Les fonctions déclarées à l'aide du modificateur __stdcall retournent des valeurs de la même façon que les fonctions déclarées à l'aide de __cdecl.
Pour les processeurs ARM et x64, __stdcall est accepté et ignoré par le compilateur ; pour les architectures ARM et x64, par convention, les quatre premiers arguments sont passés dans les registres dans la mesure du possible et les arguments suivants sont passés sur la pile.
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. Étant donné cette définition de classe,
struct CMyClass {
void __stdcall mymethod();
};
ceci
void CMyClass::mymethod() { return; }
équivaut à ceci
void __stdcall CMyClass::mymethod() { return; }
Exemple
Dans l'exemple suivant, l'utilisation de __stdcall entraîne le traitement de tous les types de fonction WINAPI comme un appel standard :
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);