__stdcall
A convenção de chamada __stdcall
é usada para chamar funções da API do Win32. O computador chamado limpa a pilha para que o compilador execute as funções vararg
__cdecl
. As funções que usam esta convenção de chamada exigem um protótipo de função. O modificador __stdcall
é específico da Microsoft.
Sintaxe
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 argumentos | Da direita para a esquerda. |
Convenção de passagem de argumentos | Por valor, a menos que um ponteiro ou um tipo de referência seja passado. |
Responsabilidade de manutenção de pilha | A função chamada remove seus próprios argumentos da pilha. |
Convenção de decoração de nome | Um sublinhado (_ ) é prefixado com o nome. O nome é seguido pela arroba (@ ) e pelo número de bytes (em decimal) na lista de argumentos. Portanto, a função declarada como int func( int a, double b ) está decorada da seguinte maneira: _func@12 |
Convenção de conversão de maiúsculas/minúsculas | Nenhum |
A opção de compilador /Gz especifica __stdcall
para todas as funções não declaradas explicitamente com outra convenção de chamada.
Para compatibilidade com versões anteriores, _stdcall
é um sinônimo para __stdcall
, a menos que a opção do compilador /Za
(Desabilitar extensões de linguagem) seja especificada.
As funções declaradas usando o modificador __stdcall
retornam os valores da mesma maneira que as funções declaradas usando __cdecl
.
Nos processadores ARM e x64, __stdcall
é aceito e ignorado pelo compilador; nas arquiteturas ARM e x64, por convenção, os argumentos são passados em registros quando possível, e os argumentos subsequentes são passados na pilha.
Para funções de classe não estáticas, se a função for definida como fora da linha, o modificador da convenção de chamada não precisará ser especificado na definição fora da linha. Ou seja, para métodos de membro de classe não estática, a convenção de chamada especificada durante a declaração é assumida no ponto de definição. Dada esta definição de classe,
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
equivale a isso
void __stdcall CMyClass::mymethod() { return; }
Exemplo
No exemplo a seguir, o uso de __stdcall
resulta em todos os tipos de função WINAPI
que sendo tratados como uma chamada 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, ...);
Confira também
Convenções de passagem e nomenclatura de argumentos
Palavras-chave
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de