Avertissement du compilateur (niveau 4) C4459

déclaration de 'identifier' masque la déclaration globale

La déclaration d’identificateur dans l’étendue locale masque la déclaration de l’identificateur nommé identiquement dans l’étendue globale. Cet avertissement vous indique que les références à l’identificateur dans cette étendue sont résolues vers la version déclarée localement, et non la version globale, qui peut ou non être votre intention. En règle générale, nous vous recommandons de réduire l’utilisation de variables globales comme bonne pratique d’ingénierie. Pour réduire la pollution de l’espace de noms global, nous vous recommandons d’utiliser un espace de noms nommé pour les variables globales.

Cet avertissement était nouveau dans Visual Studio 2015, dans le compilateur Microsoft C++ version 18.00. Pour supprimer les avertissements de cette version du compilateur ou version ultérieure lors de la migration de votre code, utilisez l’option du compilateur /Wv :18 .

Exemple

L’exemple suivant génère l’erreur 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;
}

Une façon de résoudre ce problème consiste à créer un espace de noms pour vos globals, mais pas à utiliser une using directive pour placer cet espace de noms dans l’étendue. Toutes les références doivent donc utiliser les noms qualifiés non ambigus :

// 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;
}