Udostępnij za pośrednictwem


/Zc:gotoScope (Wymuszanie zgodności w zakresie goto)

Opcja /Zc:gotoScope kompilatora umożliwia sprawdzanie zachowania standardowego języka C++ wokół goto instrukcji, które przeskoczą inicjowanie zmiennych lokalnych.

Składnia

/Zc:gotoScope[-]

Uwagi

Opcja /Zc:gotoScope kompilatora wymusza standardowe zachowanie języka C++ wokół goto instrukcji, które przeskoczą inicjowanie co najmniej jednej zmiennej lokalnej. Kompilator emituje błąd C2362 we wszystkich takich przypadkach, gdy /Zc:gotoScope jest określony. To /Zc:gotoScope- sprawdzenie zostanie złagodne, ale kompilator nadal emituje błąd, jeśli goto pomija inicjowanie zmiennej lokalnej, która ma nietrywialny destruktor.

Celem /Zc:gotoScope- tej opcji jest ułatwienie migracji starszych baz kodu do bardziej zgodnego kodu. Można go użyć do pomijania niektórych błędów, dopóki nie zaktualizowano niezgodnego kodu.

Opcja kompilatora /Zc:gotoScope jest nowa w programie Visual Studio 2022 w wersji 17.4. Opcja jest domyślnie wyłączona. Jest ona włączana automatycznie przez /permissive- opcję (lub opcję, która oznacza /permissive-, na przykład /std:c++20 lub /std:c++latest). Aby jawnie włączyć sprawdzanie błędów, dodaj /Zc:gotoScope go do wiersza polecenia kompilatora. Aby jawnie wyłączyć sprawdzanie, użyj /Zc:gotoScope- opcji . Element /Zc:gotoScope- musi pojawić się po /permissive- opcji lub dowolnej opcji, która implikuje /permissive-wartość .

Przykład

Ten przykład generuje komunikat o błędzie podczas kompilowania przy użyciu polecenia /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'
*/

Jeśli kod jest kompilowany za pomocą /Zc:gotoScope-polecenia , kompilator nie emituje błędu.

Nawet jeśli /Zc:gotoScope- jest określony, kompilator nadal emituje błąd, jeśli zmienna lokalna ma nietrywialny destruktor. Na przykład:

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'
*/

Aby ustawić tę opcję kompilatora w programie Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).

  2. Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.

  3. W obszarze Dodatkowe opcje dodaj /Zc:gotoScope lub /Zc:gotoScope-. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.

Zobacz też

/Zc (Zgodność)
/permissive-
/std (Określ wersję standardową języka)