共用方式為


編譯器警告 (層級 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;
}

修正此問題的其中一種方法是為您的全域建立命名空間,但不要使用 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;
}