/Gd, /Gr, /Gv, /Gz (convenção de chamada)
Essas opções determinam a ordem na qual os argumentos de função são enviados para a pilha, se a função do chamador ou a função chamada remove os argumentos da pilha no final da chamada e a convenção de decoração de nome que o compilador usa para identificar funções individuais.
Sintaxe
/Gd
/Gr
/Gv
/Gz
Comentários
/Gd
, a configuração padrão, especifica a convenção de chamada __cdecl para todas as funções, exceto funções de membro C++ e funções marcadas como __stdcall, __fastcall ou __vectorcall.
/Gr
especifica a convenção de chamada __fastcall
para todas as funções, exceto funções de membro C++, funções nomeadas main
e funções marcadas como __cdecl
, __stdcall
ou __vectorcall
. Todas as funções __fastcall
precisam ter protótipos. Essa convenção de chamada só está disponível nos compiladores direcionados ao x86 e é ignorada pelos compiladores direcionados a outras arquiteturas.
/Gz
especifica a convenção de chamada __stdcall
para todas as funções, exceto funções de membro C++, funções nomeadas main
e funções marcadas como __cdecl
, __fastcall
ou __vectorcall
. Todas as funções __stdcall
precisam ter protótipos. Essa convenção de chamada só está disponível nos compiladores direcionados ao x86 e é ignorada pelos compiladores direcionados a outras arquiteturas.
/Gv
especifica a convenção de chamada __vectorcall
para todas as funções, exceto funções de membro C++, funções chamadas main
, funções com uma lista de argumentos variáveis vararg
ou funções marcadas com um atributo __cdecl
, __stdcall
ou __fastcall
conflitante. Essa convenção de chamada só está disponível em arquiteturas x86 e x64 que dão suporte a /arch:SSE2 e posterior e é ignorada pelos compiladores direcionados à arquitetura ARM.
As funções que usam um número variável de argumentos precisam ser marcadas como __cdecl
.
/Gd
, /Gr
, /Gv
e /Gz
não são compatíveis com /clr:safe
ou /clr:pure. As opções do compilador /clr:pure e /clr:safe foram preteridas no Visual Studio 2015 e estão sem suporte no Visual Studio 2017 e posterior.
Observação
Para processadores x86, as funções de membro C++ usam __thiscall
, por padrão.
Para todos os processadores, uma função de membro que está explicitamente marcada como __cdecl
, __fastcall
, __vectorcall
ou __stdcall
usa a convenção de chamada especificada se ela não é ignorada na arquitetura. Uma função de membro que usa um número variável de argumentos sempre usa a convenção de chamada __cdecl
.
Essas opções do compilador não têm efeito sobre a decoração de nome de funções e métodos C++. A menos que declarado como extern "C"
, as funções e métodos C++ usam um esquema de decoração de nome diferente. Para obter mais informações, confira Nomes decorados.
Para obter mais informações sobre convenções de chamada, confira Convenções de chamada.
Especificações de __cdecl
Em processadores x86, todos os argumentos de função são passados na pilha da direita para a esquerda. Em arquiteturas ARM e x64, alguns argumentos são passados pelo registro e o restante é passado na pilha da direita para a esquerda. A rotina de chamada remove os argumentos mais recentes da pilha.
Para o C, a convenção de nomenclatura __cdecl
usa o nome da função precedido por um sublinhado (_
); nenhuma conversão de maiúsculas e minúsculas é realizada. A menos que declarado como extern "C"
, as funções C++ usam um esquema de decoração de nome diferente. Para obter mais informações, confira Nomes decorados.
Especificações de __fastcall
Alguns argumentos da função de um __fastcall
são passados em registros (para processadores x86, ECX e EDX), e o restante é enviado para a pilha da direita para a esquerda. A rotina de chamada remove esses argumentos da pilha antes de retornar. Normalmente, /Gr diminui o tempo de execução.
Observação
Tenha cuidado ao usar a convenção de chamada __fastcall
para qualquer função que seja escrita na linguagem assembly embutido. O uso de registros pode entrar em conflito com o uso do compilador.
Para o C, a convenção de nomenclatura __fastcall
usa o nome da função precedido por um sinal de arroba (@) seguido pelo tamanho dos argumentos da função em bytes. Nenhuma conversão de maiúsculas e minúsculas é realizada. O compilador usa este modelo para a convenção de nomenclatura:
@function_name@number
Ao usar a convenção de nomenclatura __fastcall
, use os arquivos de inclusão padrão. Caso contrário, você obterá referências externas não resolvidas.
Especificações de __stdcall
Os argumentos da função de um __stdcall
são enviados para a pilha da direita para a esquerda, sendo que e a função chamada remove esses argumentos da pilha antes de retornar.
Para C, a convenção de nomenclatura __stdcall
usa o nome da função precedido por um sublinhado (_) e seguido por uma arroba (@) e o tamanho dos argumentos da função em bytes. Nenhuma tradução realizada. O compilador usa este modelo para a convenção de nomenclatura:
_functionname@number
Especificações de __vectorcall
Os argumentos inteiros de uma função __vectorcall
são passados por valor, usando até dois (em x86) ou quatro (em x64) registros inteiros e até seis registros XMM para valores de ponto flutuante e vetor, e o restante é passado na pilha de direita para esquerda. A função chamada limpa a pilha antes de retornar. Os valores retornados de vetor e de ponto flutuante são retornados em XMM0.
Para o C, a convenção de nomenclatura __vectorcall
usa o nome da função seguido por dois sinais de arroba (@@) e pelo tamanho dos argumentos da função em bytes. Nenhuma tradução realizada. O compilador usa este modelo para a convenção de nomenclatura:
functionname@@number
Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio
Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.
Selecione a página de propriedades Propriedades de Configuração>C/C++>Avançadas.
Modifique a propriedade Convenção de Chamada.
Para definir essa opção do compilador via programação
- Consulte CallingConvention.