コンパイラの警告 (レベル 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;
}