__stdcall
Específicos do Microsoft
O __stdcall convenção de chamada é usada para chamar funções da API do Win32.O receptor limpa a pilha, portanto, faz com que o compilador vararg funções __cdecl.Funções que usam essa convenção de chamada exigem um protótipo de função.
return-type __stdcall function-name[(argument-list)]
Comentários
A lista a seguir mostra a implementação dessa convenção de chamada.
Elemento |
Implementação |
---|---|
Ordem de passagem de argumento |
Direita para a esquerda. |
Convenção de passagem de argumento |
Por valor, a menos que um tipo de ponteiro ou uma referência é passado. |
Responsabilidade de manutenção de pilha |
Chamada de função pops seus próprios argumentos da pilha. |
Convenção de nome-decoration. |
Um caractere de sublinhado (_) é o prefixo do nome.O nome for seguido de arroba (@) seguido do número de bytes (em decimal) na lista de argumentos.Portanto, a função declarada como int func( int a, double b ) está decorado da seguinte maneira:_func@12 |
Convenção de tradução de caso |
Nenhum |
O /Gz Especifica a opção de compilador __stdcall para todas as funções não explicitamente declaradas com uma convenção de chamada diferente.
Funções declaradas usando a __stdcall da mesma maneira que as funções declaradas usando valores de retorno do modificador _ _ cdecl.
Na família de processadores Itanium (IPF) e processadores x64, __stdcall é aceito e ignorado pelo compilador; no IPF, por convenção, parâmetros são passados no registro.
Para funções de classe non-static, se a função é definida de fora de linha, o modificador de convenção de chamada não tem a ser especificado na definição de out-of-line.Ou seja, para métodos de membro não estático da classe, será adotada a convenção de chamada especificada durante a declaração no momento da definição.Dada a definição de classe,
struct CMyClass {
void __stdcall mymethod();
};
Isso
void CMyClass::mymethod() { return; }
é equivalente a isso
void __stdcall CMyClass::mymethod() { return; }
Exemplo
No exemplo a seguir, use de _ _stdcall resulta em todas as WINAPI tipos de função que está sendo tratado como uma chamada de padrão:
// 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, ...);