__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