Partilhar via


/Zc:gotoScope (Impor conformidade no escopo goto)

A /Zc:gotoScope opção do compilador permite verificações do comportamento padrão do C++ em torno goto de instruções que saltam sobre a inicialização de variáveis locais.

Sintaxe

/Zc:gotoScope[-]

Comentários

A /Zc:gotoScope opção do compilador impõe o comportamento padrão do C++ em torno goto de instruções que saltam sobre a inicialização de uma ou mais variáveis locais. O compilador emite o erro C2362 em todos esses casos quando /Zc:gotoScope é especificado. O /Zc:gotoScope- relaxa essa verificação, mas o compilador ainda emite um erro se um goto ignora a inicialização de uma variável local que tem um destruidor não trivial.

A intenção da /Zc:gotoScope- opção é ajudar a facilitar a migração de bases de código mais antigas para um código mais compatível. Você pode usá-lo para suprimir certos erros até atualizar o código não conforme.

A /Zc:gotoScope opção do compilador é nova no Visual Studio 2022 versão 17.4. A opção é desativada por padrão. Ele é ativado automaticamente pela /permissive- opção (ou uma opção que implica /permissive-, como /std:c++20 ou /std:c++latest). Para habilitar a verificação de erros explicitamente, adicione /Zc:gotoScope à linha de comando do compilador. Para desativar explicitamente a verificação, use a /Zc:gotoScope- opção. O /Zc:gotoScope- deve aparecer após a /permissive- opção ou qualquer opção que implique /permissive-.

Exemplo

Este exemplo gera uma mensagem de erro quando compilado usando /Zc:gotoScope:

int g(int*);
bool failed(int);

int f() {
    int v1;
    auto result = g(&v1);
    if (failed(result))
        goto OnError;
    int v2 = v1 + 2;
    return v2;
OnError:
    return -1;
}

/* Output:
t.cpp(9): error C2362: initialization of 'v2' is skipped by 'goto OnError'
*/

Se o código for compilado com /Zc:gotoScope-, o compilador não emitirá o erro.

Mesmo quando /Zc:gotoScope- especificado, o compilador ainda emite um erro se a variável local tiver um destruidor não trivial. Por exemplo:

int g(int*);
bool failed(int);

class S {
public:
    S(int);
    ~S();
    int mf() const;
};

int f()
{
    int v1;
    auto result = g(&v1);
    if (failed(result))
        goto OnError;
    S s(v1);
    return s.mf();

OnError:
    return -1;
}

/* Output:
t.cpp(17): error C2362: initialization of 's' is skipped by 'goto OnError'
*/

Para definir essa opção do compilador no 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++>Linha de Comando.

  3. Em Opções adicionais, adicione /Zc:gotoScope ou /Zc:gotoScope-. Escolha OK ou Aplicar para salvar as alterações.

Confira também

/Zc (Conformidade)
/permissive-
/std (Especificar a versão padrão da linguagem)