/Zc:gotoScope (Applicare la conformità nell'ambito goto)

L'opzione /Zc:gotoScope del compilatore abilita i controlli del comportamento C++ standard per goto le istruzioni che passano all'inizializzazione delle variabili locali.

Sintassi

/Zc:gotoScope[-]

Osservazioni:

L'opzione /Zc:gotoScope del compilatore applica il comportamento standard C++ per goto le istruzioni che passano all'inizializzazione di una o più variabili locali. Il compilatore genera l'errore C2362 in tutti questi casi quando /Zc:gotoScope viene specificato. Questo /Zc:gotoScope- controllo si riduce, ma il compilatore genera comunque un errore se goto ignora l'inizializzazione di una variabile locale con un distruttore non semplice.

Lo scopo dell'opzione /Zc:gotoScope- è semplificare la migrazione di codebase meno recenti a codice più conforme. È possibile usarlo per eliminare determinati errori fino a quando non è stato aggiornato il codice non conforme.

L'opzione /Zc:gotoScope del compilatore è una novità di Visual Studio 2022 versione 17.4. L'opzione è disattivata per impostazione predefinita. Viene abilitata automaticamente dall'opzione /permissive- (o un'opzione che implica /permissive-, ad esempio /std:c++20 o /std:c++latest). Per abilitare il controllo degli errori in modo esplicito, aggiungere /Zc:gotoScope alla riga di comando del compilatore. Per disabilitare in modo esplicito il controllo, usare l'opzione /Zc:gotoScope- . Deve /Zc:gotoScope- essere visualizzato dopo l'opzione /permissive- o qualsiasi opzione che implica /permissive-.

Esempio

Questo esempio genera un messaggio di errore durante la compilazione con /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 il codice viene compilato con /Zc:gotoScope-, il compilatore non genera l'errore.

Anche quando /Zc:gotoScope- viene specificato, il compilatore genera comunque un errore se la variabile locale ha un distruttore non semplice. Ad esempio:

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

Per impostare questa opzione del compilatore in Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.

  3. In Opzioni aggiuntive aggiungere /Zc:gotoScope o /Zc:gotoScope-. Scegliere OK o Applica per salvare le modifiche.

Vedi anche

/Zc (Conformità)
/permissive-
/std (Specificare la versione standard della lingua)