Passagem de argumento e convenções de nomenclatura
Seção específica da Microsoft
Os compiladores do Microsoft C++ permitem que você especifique convenções para transmitir argumentos e retornar valores entre funções e chamadores. Nem todas as convenções estão disponíveis em todas as plataformas com suporte. Além disso, algumas convenções usam implementações específicas para a plataforma. Na maioria dos casos, as palavras-chave ou opções de compilador que especificam uma convenção sem suporte em uma plataforma específica são ignoradas e a convenção padrão de plataforma é usada.
Nas plataformas x86, todos os argumentos são ampliados para 32 bits quando são transmitidos. Os valores de retorno também são ampliados para 32 bits e retornados no registro de EAX, com exceção das estruturas de 8 bytes, que são retornadas no par de registro EDX:EAX. Estruturas maiores são retornadas no registro de EAX como ponteiros para estruturas de retorno ocultas. Os parâmetros são empurrados para a pilha da direita para a esquerda. As estruturas que não forem PODs não serão retornadas em registros.
O compilador gera códigos de prólogo e de epílogo para salvar e restaurar os registros de ESI, EDI, EBX e EBP, se eles forem usados na função.
Observação
Quando um estrutura, união ou classe é retornada de uma função pelo valor, todas as definições de tipo precisam ser iguais, caso contrário, o programa poderá falhar no runtime.
Para obter informações sobre como definir seu próprio código de prólogo e de epílogo de função, consulte Chamadas de função Naked.
Para obter mais informações sobre convenções de chamada padrão no código para plataformas x64, consulte Convenção de chamada x64. Para obter informações sobre problemas de convenção de chamada no código para plataformas ARM, consulte Problemas de migração comuns do ARM Visual C++.
As seguintes convenções de chamada são suportadas pelo compilador visual do C/C++.
Palavra-chave | Limpeza da pilha | Passagem de parâmetro |
---|---|---|
__cdecl | Chamador | Empurra parâmetros para a pilha, em ordem inversa (direita para a esquerda) |
__clrcall | N/D | Carrega parâmetros na pilha de expressões CLR em ordem (da esquerda para a direita). |
__stdcall | Receptor | Empurra parâmetros para a pilha, em ordem inversa (direita para a esquerda) |
__fastcall | Receptor | Armazenado em registros, em seguida, empurrado para a pilha |
__thiscall | Receptor | Efetuado push na pilha; o ponteiro this é armazenado no ECX |
__vectorcall | Receptor | Armazenado em registros e depois empurrado na pilha na ordem inversa (da direita para a esquerda) |
Para obter informações relacionadas, consulte Convenções de chamada obsoletas.
Fim da seção específica da Microsoft
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários