Share via


__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