Avviso del compilatore (livello 4) C4459

la dichiarazione di 'identifier' nasconde la dichiarazione globale

La dichiarazione di identificatore nell'ambito locale nasconde la dichiarazione dell'identificatore con nome identico nell'ambito globale. Questo avviso consente di sapere che i riferimenti all'identificatore in questo ambito vengono risolti nella versione dichiarata in locale, non nella versione globale, che potrebbe essere o meno la finalità. In genere, è consigliabile ridurre al minimo l'uso di variabili globali come procedura di progettazione consigliata. Per ridurre al minimo l'inquinamento dello spazio dei nomi globale, è consigliabile usare uno spazio dei nomi denominato per le variabili globali.

Questo avviso è stato nuovo in Visual Studio 2015, nella versione 18.00 del compilatore Microsoft C++. Per eliminare gli avvisi da tale versione del compilatore o versione successiva durante la migrazione del codice, usare l'opzione del compilatore /Wv:18 .

Esempio

L'esempio seguente genera l'errore C4459:

// C4459_hide.cpp
// compile with: cl /W4 /EHsc C4459_hide.cpp
int global_or_local = 1;

int main() {
    int global_or_local; // warning C4459
    global_or_local = 2;
}

Un modo per risolvere questo problema consiste nel creare uno spazio dei nomi per le organizzazioni globali, ma non usare una using direttiva per inserire tale spazio dei nomi nell'ambito, quindi tutti i riferimenti devono usare i nomi completi non ambigui:

// C4459_namespace.cpp
// compile with: cl /W4 /EHsc C4459_namespace.cpp
namespace globals {
    int global_or_local = 1;
}

int main() {
    int global_or_local; // OK
    global_or_local = 2;
    globals::global_or_local = 3;
}