cdecl
Específicos do Microsoft
Este é o padrão de convenção de chamada para programas c e C++.Porque a pilha é limpo pelo chamador, ele pode fazer vararg funções.O __cdecl convenção de chamada cria executáveis maiores que __stdcall, porque ele requer que cada chamada de função para incluir o código de limpeza da pilha.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 |
Responsabilidade de manutenção de pilha |
Chamando a função se desprenda os argumentos da pilha |
Convenção de nome-decoration. |
O caractere de sublinhado (_) é prefixado nomes, exceto quando a exportação de _ _ cdecl funciona dessa ligação c de uso. |
Convenção de tradução de caso |
Nenhuma conversão de caso realizado |
Observação |
---|
Para obter informações relacionadas, consulte Nomes decorados. |
Na família de processadores Itanium (IPF) e processadores x64, __cdecl é aceito e ignorado pelo compilador; no IPF, por convenção, parâmetros são passados no registro.
Coloque o _ _cdecl modificador antes de uma variável ou um nome de função.Como o C, nomeação e convenções de chamada são o padrão, o único momento em que você precise usar _ _cdecl é quando você tiver especificado o /Gz (stdcall) ou a opção de compilador /Gr (fastcall).O /Gd forças de opção do compilador a __cdecl convenção de chamada.
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 __cdecl mymethod();
};
Isso
void CMyClass::mymethod() { return; }
é equivalente a isso
void __cdecl CMyClass::mymethod() { return; }
Exemplo
No exemplo a seguir, o compilador é instruído a usar c nomeação e convenções para de chamada a system função:
// 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, ...);