__cdecl
__cdecl
è la convenzione di chiamata predefinita per i programmi C e C++. Poiché lo stack viene pulito dal chiamante, può eseguire vararg
funzioni. La __cdecl
convenzione di chiamata crea file eseguibili di dimensioni maggiori di __stdcall, perché richiede ogni chiamata di funzione per includere il codice di pulizia dello stack. Nell'elenco seguente viene illustrata l'implementazione di questa convenzione di chiamata. Il __cdecl
modificatore è specifico di Microsoft.
Elemento | Implementazione |
---|---|
Ordine in cui gli argomenti vengono passati | Da destra a sinistra. |
Responsabilità di manutenzione dello stack | La chiamata della funzione determina l'estrazione degli argomenti dallo stack. |
Convenzione della decorazione dei nomi | Il carattere di sottolineatura (_) è preceduto dai nomi, tranne quando vengono esportate __cdecl funzioni che usano il collegamento C. |
Convenzione della conversione maiuscolo/minuscolo e viceversa | Non viene effettuata alcuna conversione maiuscole/minuscole. |
Nota
Per informazioni correlate, vedere Decorated Names.For related information, see Decorated Names.
Posizionare il __cdecl
modificatore prima di una variabile o di un nome di funzione. Poiché le convenzioni di denominazione e chiamata C sono l'impostazione predefinita, l'unica volta che è necessario usare __cdecl
nel codice x86 è quando è stata specificata l'opzione /Gv
del compilatore (vectorcall), /Gz
(stdcall) o /Gr
(fastcall). L'opzione del compilatore /Gd forza la __cdecl
convenzione di chiamata.
Nei processori ARM e x64 viene __cdecl
accettato ma in genere ignorato dal compilatore. Per convenzione su ARM e x64, gli argomenti vengono passati nei registri quando possibile e gli argomenti successivi vengono passati nello stack. Nel codice x64 usare __cdecl
per eseguire l'override dell'opzione del compilatore /Gv e usare la convenzione di chiamata x64 predefinita.
Per le funzioni di classi non statiche, se la funzione viene definita non inline, il modificatore della convenzione di chiamata non deve essere specificato nella definizione non inline. Questo significa che per i metodi membri non statici della classe la convenzione di chiamata specificata durante la dichiarazione è presunta in corrispondenza della definizione. Data la definizione di classe seguente
struct CMyClass {
void __cdecl mymethod();
};
il codice seguente
void CMyClass::mymethod() { return; }
equivale a questo
void __cdecl CMyClass::mymethod() { return; }
Per la compatibilità con le versioni precedenti, cdecl e _cdecl sono un sinonimo di __cdecl
a meno che non sia specificata l'opzione del compilatore /Za (Disabilita estensioni del linguaggio).
Esempio
Nell'esempio seguente al compilatore viene richiesto di utilizzare le convenzioni di denominazione e chiamata di C per la funzione system
.
// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
Vedi anche
Passaggio di argomenti e convenzioni di denominazione
Parole chiave
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per