Partilhar via


/gd, /gr, /gv, /gz (convenção de chamada)

Essas opções determinam a ordem na qual os argumentos de função são empurrados para a pilha, se a função de chamador ou 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

Observações

/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 __fastcall convenção de chamada para todas as funções, exceto funções de membro C++, funções nomeadas maine funções marcadas como __cdecl, __stdcallou __vectorcall. Todas as __fastcall funções devem ter protótipos. Essa convenção de chamada só está disponível em compiladores que visam x86 e é ignorada por compiladores que visam outras arquiteturas.

/Gz especifica a __stdcall convenção de chamada para todas as funções, exceto funções de membro C++, funções nomeadas maine funções marcadas como __cdecl, __fastcallou __vectorcall. Todas as __stdcall funções devem ter protótipos. Essa convenção de chamada só está disponível em compiladores que visam x86 e é ignorada por compiladores que visam outras arquiteturas.

/Gvespecifica a __vectorcall convenção de chamada para todas as funções, exceto funções de membro C++, funções nomeadas main, funções com uma lista de vararg argumentos variáveis ou funções marcadas com um atributo , __cdeclou __stdcall conflitante__fastcall. Essa convenção de chamada só está disponível em arquiteturas x86 e x64 que suportam /arch:SSE2 e superior, e é ignorada por compiladores que visam a arquitetura ARM.

As funções que usam um número variável de argumentos devem ser marcadas __cdecl.

/Gd, /Gre /Gv/Gz não são compatíveis com /clr:safeou /clr:pure. As opções do compilador /clr:pure e /clr:safe foram preteridas no Visual Studio 2015 e não têm suporte no Visual Studio 2017 e posterior.

Observação

Por padrão para processadores x86, as funções de membro C++ usam __thiscall.

Para todos os processadores, uma função de membro que é explicitamente marcada como __cdecl, __fastcall, __vectorcallou __stdcall usa a convenção de chamada especificada se não for ignorada nessa arquitetura. Uma função de membro que usa um número variável de argumentos sempre usa a __cdecl convenção de chamada.

Essas opções do compilador não têm efeito sobre a decoração de nomes de métodos e funções C++. A menos que declarado como extern "C", os métodos e funções C++ usam um esquema de decoração de nome diferente. Para obter mais informações, consulte Nomes decorados.

Para obter mais informações sobre convenções de chamada, consulte Convenções de chamada.

__cdecl Especificidades

Em processadores x86, todos os argumentos de função são passados na pilha da direita para a esquerda. Nas 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 estoura os argumentos da pilha.

Para C, a __cdecl convenção de nomenclatura usa o nome da função precedido por um sublinhado (_); nenhuma tradução de caso é executada. 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, consulte Nomes decorados.

__fastcall Especificidades

Alguns dos argumentos de uma __fastcall função são passados em registradores (para processadores x86, ECX e EDX), e o restante é empurrado para a pilha da direita para a esquerda. A rotina chamada estoura esses argumentos da pilha antes que ela retorne. Normalmente, /Gr diminui o tempo de execução.

Observação

Tenha cuidado ao usar a __fastcall convenção de chamada para qualquer função escrita em linguagem assembly embutida. Seu uso de registros pode entrar em conflito com o uso do compilador.

Para C, a __fastcall convenção de nomenclatura usa o nome da função precedido por um sinal de arroba (@) seguido pelo tamanho dos argumentos da função em bytes. Nenhuma tradução de caso é feita. O compilador usa este modelo para a convenção de nomenclatura:

@function_name@number

Ao usar a __fastcall convenção de nomenclatura, use os arquivos de inclusão padrão. Caso contrário, você obterá referências externas não resolvidas.

__stdcall Especificidades

Os argumentos de uma __stdcall função são empurrados para a pilha da direita para a esquerda, e a função chamada exibe esses argumentos da pilha antes que ela retorne.

Para C, a __stdcall convenção de nomenclatura usa o nome da função precedido por um sublinhado (_) e seguido por um sinal de arroba (@) e o tamanho dos argumentos da função em bytes. Nenhuma tradução de caso é realizada. O compilador usa este modelo para a convenção de nomenclatura:

_functionname@number

__vectorcall Especificidades

Os argumentos inteiros de uma __vectorcall função são passados por valor, usando até dois (em x86) ou quatro (em x64) registradores inteiros, e até seis registradores XMM para valores vetoriais e de ponto flutuante, e o restante é passado na pilha da direita para a esquerda. A função chamada limpa a pilha antes que ela retorne. Os valores de retorno vetorial e de ponto flutuante são retornados em XMM0.

Para C, a __vectorcall convenção de nomenclatura usa o nome da função seguido por dois sinais (@@) e o tamanho dos argumentos da função em bytes. Nenhuma tradução de caso é realizada. O compilador usa este modelo para a convenção de nomenclatura:

functionname@@number

Para definir essa opção de compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir compilador C++ e criar propriedades no Visual Studio.

  2. Selecione a página de propriedades Configuration Properties C/C++Advanced (> de configuração>Advanced).

  3. Modifique a propriedade Calling Convention .

Para definir essa opção do compilador programaticamente

Ver também