Udostępnij za pomocą


Ostrzeżenie kompilatora (poziom 4) C4459

deklaracja "identifier" ukrywa deklarację globalną

Uwagi

Deklaracja identyfikatora w zakresie lokalnym ukrywa deklarację identycznie nazwanego identyfikatora w zakresie globalnym. To ostrzeżenie informuje o tym, że odwołania do identyfikatora w tym zakresie rozpoznają lokalnie zadeklarowaną wersję, a nie wersję globalną, która może być twoją intencją. Ogólnie rzecz biorąc, zalecamy zminimalizowanie użycia zmiennych globalnych jako dobrej praktyki inżynieryjnej. Aby zminimalizować zanieczyszczenie globalnej przestrzeni nazw, zalecamy użycie nazwanej przestrzeni nazw dla zmiennych globalnych.

To ostrzeżenie było nowe w programie Visual Studio 2015 w kompilatorze Microsoft C++ w wersji 18.00. Aby pominąć ostrzeżenia z tej wersji kompilatora lub nowszej podczas migrowania kodu, użyj opcji /Wv:18 kompilatora.

Przykład

Poniższy przykład 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;
}

Jednym ze sposobów rozwiązania tego problemu jest utworzenie przestrzeni nazw dla globalnych, ale nie użycie using dyrektywy w celu przeniesienia tej przestrzeni nazw do zakresu, więc wszystkie odwołania muszą używać jednoznacznych nazw kwalifikowanych:

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