/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
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++>Linha de Comando.
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)