Compartir vía


/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

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

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.

  3. 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)