__cdecl
Específico da Microsoft
__cdecl é uma convenção de chamada padrão para programas em C e C++. Como a pilha é removida pelo chamador, é possível executar funções vararg. A convenção de chamada __cdecl cria executáveis maiores do que __stdcall porque requer que cada chamada de função inclua código de limpeza de pilha. 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. |
Responsabilidade de manutenção de pilha |
A função de chamada remove os argumentos da pilha. |
Convenção de decoração de nome |
O caractere de sublinhado (_) é prefixado para nomes, exceto ao exportar funções __cdecl que usam vínculos do C. |
Convenção de conversão de maiúsculas/minúsculas |
Nenhuma conversão de maiúsculas/minúsculas é realizada. |
Dica
Para obter informações relacionadas, consulte Nomes decorados.
Coloque o modificador __cdecl antes do nome de uma variável ou função. Como as convenções de chamada e nomenclatura de C são padrão, a única vez que você precisa usar __cdecl em código x86 é quando tiver especificado a opção de compilador /Gv (vectorcall), /Gz (stdcall) ou /Gr (fastcall). A opção de compilador /Gd impõe a convenção de chamada __cdecl.
Em processadores ARM e x64, __cdecl é aceito, mas normalmente é ignorado pelo compilador. Por convenção no ARM e x64, os argumentos são passados nos registros quando possível, e os argumentos subsequentes são passados na pilha. No código x64, use __cdecl para substituir a opção de compilador /Gv e use a convenção de chamada x64 padrão.
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 __cdecl mymethod();
};
isto:
void CMyClass::mymethod() { return; }
equivale a isto:
void __cdecl CMyClass::mymethod() { return; }
Exemplo
No exemplo a seguir, o compilador é instruído para usar convenções de nomenclatura e chamada em C para a função system.
// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);