コンパイラの警告 (レベル 4) C4459

'identifier' を宣言すると、グローバル宣言が隠蔽されます

ローカル スコープの"識別子" を宣言すると、グローバル スコープ内の同じ名前の"識別子" の宣言が非表示になります。 この警告により、このスコープ内の"識別子" への参照は、グローバル バージョンではなく、ローカルで宣言されたバージョンに解決されることが示されます。これは、意図と異なる場合があります。 一般に、優れたエンジニアリング プラクティスとして、グローバル変数の使用は最小限に抑えることをお勧めします。 グローバル名前空間の汚染を最小限に抑えるために、グローバル変数には名前付き名前空間を使用することをお勧めします。

この警告は、Visual Studio 2015 (Microsoft C++ コンパイラ バージョン 18.00) の新機能です。 コードの移行中に、そのバージョン以降のコンパイラの警告を抑制するには、/Wv:18 コンパイラ オプションを使用します。

次のサンプルでは 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;
}

この問題を解決する 1 つの方法は、グローバルの名前空間を作成する一方で、using ディレクティブを使用してその名前空間をスコープに含めないというものです。このため、すべての参照で明確な修飾名を使用する必要があります。

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