Share via


Upozornění kompilátoru (úroveň 4) C4459

Deklarace identifikátoru skryje globální deklaraci.

Deklarace identifikátoru v místním oboru skryje deklaraci identického identifikátoru v globálním oboru. Toto upozornění vás upozorní, že odkazy na identifikátor v tomto oboru se přeloží na místně deklarovanou verzi, nikoli na globální verzi, která může nebo nemusí být vaším záměrem. Obecně doporučujeme minimalizovat použití globálních proměnných jako dobrý technický postup. Pokud chcete minimalizovat znečištění globálního oboru názvů, doporučujeme pro globální proměnné použít pojmenovaný obor názvů.

Toto upozornění bylo v sadě Visual Studio 2015 v kompilátoru Microsoft C++ verze 18.00 nové. Chcete-li potlačit upozornění z této verze kompilátoru nebo novější při migraci kódu, použijte možnost kompilátoru /Wv:18 .

Příklad

Následující ukázka generuje 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;
}

Jedním ze způsobů, jak tento problém vyřešit, je vytvořit obor názvů pro globální objekty, ale použít direktivu using k přenesení tohoto oboru názvů do oboru, takže všechny odkazy musí používat jednoznačné kvalifikované názvy:

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