__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
__stdcall
function-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
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