Предупреждение компилятора (уровень 4) C4459
Объявление идентификатора скрывает глобальное объявление
Объявление идентификатора в локальной области скрывает объявление одинаково именованного идентификатора в глобальной области. Это предупреждение позволяет узнать, что ссылки на идентификатор в этой области разрешаются локально объявленной версии, а не глобальной версии, которая может быть вашим намерением. Как правило, мы рекомендуем свести к минимуму использование глобальных переменных в качестве хорошей инженерной практики. Чтобы минимизировать загрязнение глобального пространства имен, рекомендуется использовать именованное пространство имен для глобальных переменных.
Это предупреждение было новым в 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;
}