/Zc:gotoScope
(Exigir conformidad en el ámbito goto)
La /Zc:gotoScope
opción del compilador habilita comprobaciones del comportamiento estándar de C++ en torno a goto
instrucciones que saltan sobre la inicialización de variables locales.
Sintaxis
/Zc:gotoScope
[-
]
Comentarios
La /Zc:gotoScope
opción del compilador aplica el comportamiento estándar de C++ en torno a goto
instrucciones que saltan sobre la inicialización de una o varias variables locales. El compilador emite el error C2362 en todos estos casos cuando /Zc:gotoScope
se especifica. /Zc:gotoScope-
Relaja esta comprobación, pero el compilador sigue emitiendo un error si goto
omite la inicialización de una variable local que tiene un destructor no trivial.
La intención de la /Zc:gotoScope-
opción es ayudar a facilitar la migración de bases de código anteriores a código más conforme. Puede usarlo para suprimir determinados errores hasta que haya actualizado el código no conforme.
La /Zc:gotoScope
opción del compilador es nueva en Visual Studio 2022, versión 17.4. De forma predeterminada, la opción está desactivada. Se habilita automáticamente mediante la /permissive-
opción (o una opción que implica /permissive-
, como /std:c++20
o /std:c++latest
). Para habilitar la comprobación de errores explícitamente, agregue /Zc:gotoScope
a la línea de comandos del compilador. Para deshabilitar explícitamente la comprobación, use la /Zc:gotoScope-
opción . /Zc:gotoScope-
Debe aparecer después de la /permissive-
opción o cualquier opción que implique /permissive-
.
Ejemplo
Este ejemplo genera un mensaje de error cuando se compila mediante /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'
*/
Si el código se compila con /Zc:gotoScope-
, el compilador no emite el error.
Incluso cuando /Zc:gotoScope-
se especifica , el compilador sigue emitiendo un error si la variable local tiene un destructor no trivial. Por ejemplo:
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 establecer esta opción del compilador en Visual Studio
Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.
Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.
En Opciones adicionales, agregue
/Zc:gotoScope
o/Zc:gotoScope-
. Haga clic en Aceptar o en Aplicar para guardar los cambios.
Consulte también
/Zc
(Conformidad)
/permissive-
/std
(Especificar la versión estándar del lenguaje)