/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

  1. 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.

  2. Selecione a página de propriedades Propriedades de Configuração>C/C++>Avançadas.

  3. Modifique a propriedade Convenção de Chamada.

Para definir essa opção do compilador via programação

Confira também