Compilerwarnung (Ebene 4) C4459

Die Deklaration von "Identifier" blendet die globale Deklaration aus.

Die Deklaration des Bezeichners im lokalen Bereich blendet die Deklaration des identisch benannten Bezeichners im globalen Bereich aus. Diese Warnung informiert Sie, dass Verweise auf den Bezeichner in diesem Bereich auf die lokal deklarierte Version aufgelöst werden, nicht auf die globale Version, die möglicherweise Ihre Absicht ist oder nicht. Im Allgemeinen wird empfohlen, die Verwendung globaler Variablen als bewährte Technische Praxis zu minimieren. Um die Verschmutzung des globalen Namespace zu minimieren, empfehlen wir die Verwendung eines benannten Namespaces für globale Variablen.

Diese Warnung war neu in Visual Studio 2015, in Microsoft C++-Compiler, Version 18.00. Verwenden Sie die Compileroption "/Wv:18 ", um Warnungen von dieser Version des Compilers oder höher beim Migrieren des Codes zu unterdrücken.

Beispiel

Im folgenden Beispiel wird C4459 generiert:

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

Eine Möglichkeit, dieses Problem zu beheben, besteht darin, einen Namespace für Ihre Globalen zu erstellen, aber keine Direktive zu verwenden using , um diesen Namespace in den Gültigkeitsbereich zu bringen, sodass alle Verweise die eindeutigen qualifizierten Namen verwenden müssen:

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