Compartir a través de


Advertencia del compilador (nivel 4) C4459

declaración de "identifier" oculta la declaración global

La declaración de identifier en el ámbito local oculta la declaración del identifier con nombre idéntico en el ámbito global. Esta advertencia le permite saber que las referencias a identifier en este ámbito se resuelven en la versión declarada localmente, no en la versión global, que puede ser o no su intención. Por lo general, en ingeniería se recomienda minimizar el uso de variables globales. Para minimizar la contaminación del espacio de nombres global, se recomienda usar un espacio de nombres con nombre para variables globales.

Esta advertencia se introdujo en Visual Studio 2015, en la versión 18.00 del compilador de Microsoft C++. Para suprimir las advertencias de esa versión del compilador o versiones posteriores al migrar el código, use la opción del compilador /Wv:18.

Ejemplo

El ejemplo siguiente genera la advertencia 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;
}

Una manera de corregir este problema es crear un espacio de nombres para las variables globales, pero no usar una directiva using para colocar ese espacio de nombres en el ámbito, de manera que todas las referencias deben usar los nombres calificados no ambiguos:

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