Partilhar via


__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, ...);

Consulte também

Referência

Passagem de argumento e convenções de nomenclatura

Palavras-chave C++