/Gd, /Gr, /Gv, /Gz (Convenzione di chiamata)
Queste opzioni determinano l'ordine in cui gli argomenti della funzione vengono inseriti nello stack, se la funzione chiamante o la funzione chiamata rimuove gli argomenti dallo stack alla fine della chiamata e la convenzione di decorazione dei nomi usata dal compilatore per identificare le singole funzioni.
Sintassi
/Gd
/Gr
/Gv
/Gz
Osservazioni:
/Gd
, l'impostazione predefinita, specifica la convenzione di chiamata __cdecl per tutte le funzioni, ad eccezione di funzioni membro C++ contrassegnate __stdcall, __fastcall o __vectorcall.
/Gr
specifica la convenzione di __fastcall
chiamata per tutte le funzioni tranne le funzioni membro C++, le funzioni denominate main
e le funzioni contrassegnate come __cdecl
, __stdcall
o __vectorcall
. Tutte le funzioni __fastcall
devono avere prototipi. Questa convenzione di chiamata è disponibile solo nei compilatori in x86 e viene ignorata dai compilatori che usano altre architetture.
/Gz
specifica la convenzione di __stdcall
chiamata per tutte le funzioni tranne le funzioni membro C++, le funzioni denominate main
e le funzioni contrassegnate come __cdecl
, __fastcall
o __vectorcall
. Tutte le funzioni __stdcall
devono avere prototipi. Questa convenzione di chiamata è disponibile solo nei compilatori in x86 e viene ignorata dai compilatori che usano altre architetture.
/Gv
specifica la __vectorcall
convenzione di chiamata per tutte le funzioni ad eccezione di funzioni membro C++, funzioni denominate main
, funzioni con un vararg
elenco di argomenti variabile o funzioni contrassegnate __cdecl
con un attributo , __stdcall
o __fastcall
in conflitto. Questa convenzione di chiamata è disponibile solo nelle architetture x86 e x64 che supportano /arch:SSE2 e versioni successive e viene ignorata dai compilatori che usano l'architettura ARM.
Le funzioni che accettano un numero variabile di argomenti devono essere contrassegnate come __cdecl
.
/Gd
, /Gr
e non sono compatibili con /clr:safe
o /clr:pure./Gz
/Gv
Le opzioni del compilatore /clr:pure e /clr:safe sono deprecate in Visual Studio 2015 e non sono supportate in Visual Studio 2017 e versioni successive.
Nota
Per impostazione predefinita per i processori x86, le funzioni membro C++ usano __thiscall
.
Per tutti i processori, una funzione membro contrassegnata in modo esplicito come __cdecl
, __fastcall
, __vectorcall
o __stdcall
usa la convenzione di chiamata specificata se non viene ignorata in tale architettura. Una funzione membro che accetta un numero variabile di argomenti usa sempre la convenzione di chiamata __cdecl
.
Queste opzioni del compilatore non hanno effetto sulla decorazione dei nomi dei metodi e delle funzioni C++. A meno che non siano dichiarati come extern "C"
, i metodi e le funzioni C++ usano uno schema di decorazione dei nomi diverso. Per altre informazioni, vedere Nomi decorati.
Per altre informazioni sulle convenzioni di chiamata, vedere Convenzioni di chiamata.
Specifiche di __cdecl
Nei processori x86 tutti gli argomenti delle funzioni vengono passati allo stack da destra a sinistra. Nelle architetture ARM e x64 alcuni argomenti vengono passati per registro e i rimanenti vengono passati allo stack da destra a sinistra. La routine chiamante preleva gli argomenti dallo stack.
Per C, la convenzione di denominazione di __cdecl
usa il nome della funzione preceduto da un carattere di sottolineatura ( _
). Non viene effettuata alcuna conversione maiuscolo/minuscolo. A meno che non siano dichiarate come extern "C"
, le funzioni C++ usano uno schema di decorazione dei nomi diverso. Per altre informazioni, vedere Nomi decorati.
Specifiche di __fastcall
Alcuni degli argomenti di una funzione __fastcall
vengono passati in registri (per i processori x86, ECX ed EDX) e i rimanenti vengono inseriti nello stack da destra a sinistra. La routine chiamata preleva questi argomenti dallo stack prima di restituire un valore. In genere /Gr riduce il tempo di esecuzione.
Nota
Prestare attenzione quando si usa la convenzione di chiamata di __fastcall
per una funzione scritta nel linguaggio dell'assembly inline. L'uso dei registri potrebbe essere in conflitto con l'uso del compilatore.
Per C, la convenzione di denominazione di __fastcall
usa il nome della funzione preceduto da un simbolo di chiocciola (@) e seguito dalle dimensioni degli argomenti della funzione in byte. Non viene effettuata alcuna conversione maiuscolo/minuscolo. Il compilatore usa questo modello per la convenzione di denominazione:
@function_name@number
Quando si usa la convenzione di denominazione di __fastcall
, usare i file di inclusione standard. In caso contrario, si otterranno riferimenti esterni non risolti.
Specifiche di __stdcall
Gli argomenti di una funzione __stdcall
vengono inseriti nello stack da destra a sinistra e la funzione chiamata preleva questi argomenti dallo stack prima di restituire un valore.
Per C, la __stdcall
convenzione di denominazione usa il nome della funzione preceduto da un carattere di sottolineatura (_) e seguito da un segno (@) e dalle dimensioni degli argomenti della funzione in byte. Non viene effettuata alcuna conversione maiuscolo/minuscolo. Il compilatore usa questo modello per la convenzione di denominazione:
_functionname@number
Specifiche di __vectorcall
Gli argomenti integer di una __vectorcall
funzione vengono passati per valore, usando fino a due (su x86) o quattro registri interi (su x64) e fino a sei registri XMM per i valori a virgola mobile e vettoriale e il resto vengono passati nello stack da destra a sinistra. La funzione chiamata pulisce lo stack prima di restituire un risultato. I valori restituiti del vettore e a virgola mobile vengono restituiti in XMM0.
Per C, la convenzione di denominazione di __vectorcall
usa il nome della funzione seguito da due simboli di chiocciola (@@) e dalle dimensioni degli argomenti della funzione in byte. Non viene effettuata alcuna conversione maiuscolo/minuscolo. Il compilatore usa questo modello per la convenzione di denominazione:
functionname@@number
Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.
Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Avanzate.
Modificare la proprietà Convenzione di chiamata.
Per impostare l'opzione del compilatore a livello di codice
- Vedere CallingConvention.