/Gd, /Gr, /Gv, /Gz (Convention d'appel)
Ces options déterminent l’ordre dans lequel les arguments de fonction sont envoyés dans la pile, si la fonction de l’appelant ou la fonction appelée supprime les arguments de la pile à la fin de l’appel, ainsi que la convention de décoration de nom que le compilateur utilise pour identifier des fonctions individuelles.
Syntaxe
/Gd
/Gr
/Gv
/Gz
Notes
/Gd
, le paramètre par défaut, spécifie la convention d’appel __cdecl pour toutes les fonctions, à l’exception des fonctions membres C++ marquées __stdcall, __fastcall ou __vectorcall.
/Gr
spécifie la __fastcall
convention d’appel pour toutes les fonctions, à l’exception des fonctions membres C++, des fonctions nommées main
et des fonctions marquées __cdecl
, __stdcall
ou __vectorcall
. Toutes les fonctions __fastcall
doivent avoir des prototypes. Cette convention d’appel est uniquement disponible dans les compilateurs qui ciblent x86 et est ignorée par les compilateurs qui ciblent d’autres architectures.
/Gz
spécifie la __stdcall
convention d’appel pour toutes les fonctions, à l’exception des fonctions membres C++, des fonctions nommées main
et des fonctions marquées __cdecl
, __fastcall
ou __vectorcall
. Toutes les fonctions __stdcall
doivent avoir des prototypes. Cette convention d’appel est uniquement disponible dans les compilateurs qui ciblent x86 et est ignorée par les compilateurs qui ciblent d’autres architectures.
/Gv
spécifie la __vectorcall
convention d’appel pour toutes les fonctions, à l’exception des fonctions membres C++, des fonctions nommées main
, des fonctions avec une liste d’arguments vararg
de variable ou des fonctions marquées avec un conflit __cdecl
, __stdcall
ou __fastcall
un attribut. Cette convention d’appel est disponible uniquement sur les architectures x86 et x64 qui prennent en charge/arch:SSE2 et ultérieur, et est ignorée par les compilateurs qui ciblent l’architecture ARM.
Les fonctions qui prennent un nombre variable d’arguments doivent être marquées __cdecl
.
/Gd
, /Gr
et ne sont pas compatibles avec /clr:safe
ou /clr :pure./Gz
/Gv
Les options de compilateur /clr:pure et /clr:safe sont dépréciées dans Visual Studio 2015 et non prises en charge dans Visual Studio 2017 et ultérieur.
Remarque
Par défaut, pour les processeurs x86, les fonctions membres C++ utilisent __thiscall
.
Pour tous les processeurs, une fonction membre qui est marquée explicitement comme __cdecl
, __fastcall
, __vectorcall
, ou __stdcall
utilise la convention d’appel spécifiée si elle n’est pas ignorée sur cette architecture. Une fonction membre qui accepte un nombre variable d’arguments utilise toujours la convention d’appel __cdecl
.
Ces options du compilateur n’ont aucun effet sur la décoration de nom des fonctions et méthodes C++. À moins d’être déclarées comme extern "C"
, les fonctions et méthodes C++ utilisent un mécanisme de décoration de nom différent. Pour plus d’informations, consultez Noms décorés.
Pour plus d’informations sur les conventions d’appel, consultez Conventions d’appel.
Spécificités de __cdecl
Sur les processeurs x86, tous les arguments de fonction sont passés sur la pile de droite à gauche. Sur les architectures ARM et x64, certains arguments sont passés par le registre et les autres sont passés sur la pile de droite à gauche. La routine d’appel enlève les arguments de la pile.
Pour C, la convention de nommage __cdecl
utilise le nom de fonction précédé par un trait de soulignement ( _
) ; aucune conversion de casse n’est effectuée. À moins d’être déclarées comme extern "C"
, les fonctions C++ utilisent un autre mécanisme de décoration de nom. Pour plus d’informations, consultez Noms décorés.
Spécificités de __fastcall
Certains des arguments d’une fonction __fastcall
sont passés dans les registres (pour les processeurs x86, ECX et EDX), et les autres sont envoyés dans la pile de droite à gauche. La routine appelée enlève ces arguments de la pile avant d’être retournée. En règle générale, /Gr diminue la durée d’exécution.
Remarque
Soyez prudent lorsque vous utilisez la convention d’appel __fastcall
pour n’importe quelle fonction qui est écrite en langage assembleur inline. L’utilisation des registres peut entrer en conflit avec celle du compilateur.
Pour C, la convention de nommage __fastcall
utilise le nom de fonction précédé par un arobase (@) suivi de la taille des arguments de la fonction en octets. Aucune conversion de casse n’est effectuée. Le compilateur utilise le modèle suivant pour la convention de nommage :
@function_name@number
Lorsque vous utilisez la convention de nommage __fastcall
, utilisez les fichiers include standard. Sinon, vous obtiendrez des références externes non résolues.
Spécificités de __stdcall
Les arguments d’une fonction __stdcall
sont envoyés dans la pile de droite à gauche, et la fonction appelée enlève ces arguments de la pile avant d’être retournée.
Pour C, la __stdcall
convention d’affectation de noms utilise le nom de la fonction précédé d’un trait de soulignement (_) et suivi d’un signe à signe (@) et de la taille des arguments de la fonction en octets. Aucune conversion de casse n'a lieu. Le compilateur utilise le modèle suivant pour la convention de nommage :
_functionname@number
Spécificités de __vectorcall
Les arguments entiers d’une __vectorcall
fonction sont passés par valeur, en utilisant jusqu’à deux registres entiers (sur x86) ou quatre (sur x64) et jusqu’à six registres XMM pour les valeurs à virgule flottante et vectorielle, et le reste est passé sur la pile de droite à gauche. La fonction appelée nettoie la pile avant d’être retournée. Les valeurs de retour à virgule flottante et vectorielles sont retournées dans XMM0.
Pour C, la convention de nommage __vectorcall
utilise le nom de fonction suivi de deux arobases (@@) et la taille des arguments de la fonction en octets. Aucune conversion de casse n'a lieu. Le compilateur utilise le modèle suivant pour la convention de nommage :
functionname@@number
Pour définir cette option du compilateur dans l'environnement de développement Visual Studio
Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d’informations, consultez Définir le compilateur C++ et les propriétés de build dans Visual Studio.
Sélectionnez la page de Propriétés de configuration>C/C++>Avancé.
Modifiez la propriété Convention d’appel.
Pour définir cette option du compilateur par programmation
- Consultez CallingConvention.