__thiscall
La convention d’appel spécifique à Microsoft __thiscall
est utilisée sur les fonctions membres de classe C++ sur l’architecture x86. Il s’agit de la convention d’appel par défaut utilisée par des fonctions membres qui n’utilisent aucun argument de variable (fonctions vararg
).
Sous __thiscall
, l’appelé nettoie la pile, ce qui est impossible pour des fonctions vararg
. Les arguments sont envoyés sur la pile de droite à gauche. Le pointeur this
est transmis par l’inscription ECX, pas sur la pile.
Sur les ordinateurs ARM, ARM64 et x64, __thiscall
est accepté et ignoré par le compilateur. C’est parce qu’ils utilisent par défaut une convention d’appel basée sur un registre.
L’une des raisons d’utiliser __thiscall
se trouve dans des classes dont les fonctions membres utilisent __clrcall
par défaut. Dans ce cas, vous pouvez utiliser __thiscall
pour rendre joignables les fonctions membres individuelles à partir du code natif.
Lors de la compilation avec /clr:pure
, toutes les fonctions et tous les pointeurs de fonction ont la valeur __clrcall
, sauf indication contraire. Les options /clr:pure
et /clr:safe
du compilateur sont déconseillées dans Visual Studio 2015 et non prise en charge dans Visual Studio 2017.
Des fonctions membres vararg
utilisent la convention d’appel __cdecl
. Tous les arguments de fonction sont envoyés (push) sur la pile, avec le pointeur this
placé sur la pile en dernier.
Cette convention d’appel s’appliquant uniquement à C++, elle n’a pas de schéma de décoration de nom C.
Lorsque vous définissez une fonction membre de classe non statique comme étant hors ligne, spécifiez le modificateur de convention d’appel uniquement dans la déclaration. Vous n’avez pas besoin de le spécifier à nouveau sur la définition hors ligne. Le compilateur utilise la convention d’appel spécifiée pendant la déclaration au point de définition.