__cdecl
__cdecl
é a 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 ela 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. O modificador __cdecl
é específico da Microsoft.
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 aos nomes, exceto quando __cdecl funções que usam a vinculação C são exportadas. |
Convenção de conversão de maiúsculas/minúsculas | Nenhuma conversão de maiúsculas/minúsculas é realizada. |
Observação
Para obter mais informações, confira 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; }
Para compatibilidade com versões anteriores, cdecl e _cdecl são sinônimos de __cdecl
, a menos que a opção do compilador /Za (Desabilitar extensões de linguagem) seja especificada.
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, ...);
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