Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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)]
auto__stdcallnome funzione [(argument-list)] [->tipo restituito ]
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 __stdcall tipi di WINAPI 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