编译器警告(等级 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;
}