Sdílet prostřednictvím


/Zc:gotoScope (Vynucení shody v oboru goto)

Možnost /Zc:gotoScope kompilátoru umožňuje kontrolovat standardní chování jazyka C++ kolem goto příkazů, které přeskočí přes inicializaci místních proměnných.

Syntaxe

/Zc:gotoScope[-]

Poznámky

Možnost kompilátoru /Zc:gotoScope vynucuje standardní chování jazyka C++ kolem goto příkazů, které přeskočí na inicializaci jedné nebo více místních proměnných. Kompilátor vygeneruje chybu C2362 ve všech takových případech, pokud /Zc:gotoScope je zadán. Uvolní /Zc:gotoScope- tuto kontrolu, ale kompilátor stále generuje chybu, pokud goto přeskočí inicializaci místní proměnné, která má ne triviální destruktor.

Cílem této /Zc:gotoScope- možnosti je usnadnit migraci starších základů kódu na konformnější kód. Můžete ho použít k potlačení určitých chyb, dokud neaktualizujete nevyhovující kód.

Možnost kompilátoru /Zc:gotoScope je nová v sadě Visual Studio 2022 verze 17.4. Možnost je ve výchozím nastavení vypnutá. Tato možnost je povolena automaticky /permissive- (nebo možností, která znamená /permissive-, například /std:c++20 nebo /std:c++latest). Pokud chcete kontrolu chyb povolit explicitně, přidejte /Zc:gotoScope ji do příkazového řádku kompilátoru. Pokud chcete tuto kontrolu explicitně zakázat, použijte tuto /Zc:gotoScope- možnost. Musí /Zc:gotoScope- se zobrazit za /permissive- možností nebo jakoukoli z možností, které znamenají /permissive-.

Příklad

Tato ukázka vygeneruje chybovou zprávu při kompilaci pomocí /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'
*/

Pokud je kód zkompilován /Zc:gotoScope-, kompilátor nevysílá chybu.

I když /Zc:gotoScope- je zadán, kompilátor stále generuje chybu, pokud má místní proměnná ne triviální destruktor. Příklad:

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

Nastavení této možnosti kompilátoru v sadě Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.

  3. V dalších možnostech přidejte /Zc:gotoScope nebo /Zc:gotoScope-. Změny uložíte kliknutím na OK nebo Použít .

Viz také

/Zc (Shoda)
/permissive-
/std (Určení standardní verze jazyka)