__stdcall
Sezione specifica Microsoft
La convenzione di chiamata __stdcall viene utilizzata per chiamare le funzioni dell'API Win32. Il chiamato pulisce lo stack, il compilatore di conseguenza rende le funzioni vararg __cdecl. Le funzioni che utilizzano questa convenzione di chiamata richiedono un prototipo di funzione.
return-type __stdcall function-name[(argument-list)]
Note
Nell'elenco seguente viene illustrata l'implementazione di questa convenzione di chiamata.
Elemento |
Implementazione |
---|---|
Ordine in cui gli argomenti vengono passati |
Da destra a sinistra. |
Convenzione per il passaggio degli argomenti |
Per valore, a meno che non venga passato un puntatore o un tipo di riferimento. |
Responsabilità di manutenzione dello stack |
La funzione chiamata determina l'estrazione dei propri argomenti dallo stack. |
Convenzione della decorazione dei nomi |
Un carattere di sottolineatura (_) viene aggiunto come prefisso del nome. Il nome è seguito dal simbolo @ seguito dal numero di byte (in decimale) nell'elenco di argomenti. Pertanto, la funzione dichiarata come int func( int a, double b ) è decorata come segue: _func@12 |
Convenzione della conversione maiuscolo/minuscolo e viceversa |
Nessuno |
L'opzione del compilatore /Gz specifica __stdcall per tutte le funzioni non dichiarate in modo esplicito con una convenzione di chiamata diversa.
Le funzioni dichiarate utilizzando il modificatore __stdcall restituiscono valori in modo analogo alle funzioni dichiarate utilizzando __cdecl.
Nei processori ARM e x64, __stdcall viene accettata e ignorata dal compilatore; nelle architetture ARM e x64, per convenzione, gli argomenti vengono passati in registri quando possibile, mentre gli argomenti successivi vengono passati nello stack.
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 questa definizione di classe,
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
equivale a questo
void __stdcall CMyClass::mymethod() { return; }
Esempio
Nell'esempio seguente l'utilizzo dei risultati di __stdcall attiva la gestione di tutti i tipi di funzione WINAPI come una chiamata standard:
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);