/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 mainet des fonctions marquées __cdecl, __stdcallou __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 mainet des fonctions marquées __cdecl, __fastcallou __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, __stdcallou __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, /Gret 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

  1. 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.

  2. Sélectionnez la page propriétés>de configuration C/C++>Propriétés avancées.

  3. Modifiez la propriété Convention d’appel.

Pour définir cette option du compilateur par programmation

Voir aussi