编译器警告(等级 4)C4459

“identifier”的声明隐藏了全局声明

本地范围内的 identifier 声明隐藏了全局范围内同名 identifier 的声明。 此警告指示在此范围中对 identifier 的引用将解析为本地声明的版本,而不是全局版本,这可能是你的意图,也可能不是。 通常,建议尽量不使用全局变量,这是一种良好的工程实践。 为了最大程度地减少全局命名空间的污染,建议对全局变量使用命名空间。

这是 Microsoft C++ 编译器 18.00 版本的 Visual Studio 2015 中的一条新增警告。 若要在迁移代码时禁止显示该编译器版本或更高版本的警告,请使用 /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;
}