__stdcall

La __stdcall convenzione di chiamata viene usata per chiamare le funzioni API Win32. Il chiamato pulisce lo stack, quindi il compilatore crea vararg funzioni __cdecl. Le funzioni che utilizzano questa convenzione di chiamata richiedono un prototipo di funzione. Il __stdcall modificatore è specifico di Microsoft.

Sintassi

return-type__stdcallfunction-name[(argument-list)]

Osservazioni:

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 (_) è preceduto dal nome. Il nome è seguito dal segno (@) 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 None

L'opzione del compilatore /Gz specifica __stdcall per tutte le funzioni non dichiarate in modo esplicito con una convenzione di chiamata diversa.

Per la compatibilità con le versioni precedenti, _stdcall è un sinonimo di __stdcall a meno che non sia specificata l'opzione /Za del compilatore (Disabilita estensioni del linguaggio).

Le funzioni dichiarate usando il __stdcall modificatore restituiscono valori allo stesso modo delle funzioni dichiarate usando __cdecl.

Nei processori ARM e x64, __stdcall viene accettato e ignorato dal compilatore. Nelle architetture ARM e x64, per convenzione, gli argomenti vengono passati nei registri quando possibile e 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'uso dei risultati in tutti i WINAPI tipi di __stdcall funzione gestiti come 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, ...);

Vedi anche

Passaggio di argomenti e convenzioni di denominazione
Parole chiave