/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 maine le funzioni contrassegnate come __cdecl, __stdcallo __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 maine le funzioni contrassegnate come __cdecl, __fastcallo __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 __cdeclcon un attributo , __stdcallo __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, /Gre 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

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Avanzate.

  3. Modificare la proprietà Convenzione di chiamata.

Per impostare l'opzione del compilatore a livello di codice

Vedi anche