Поделиться через


Предупреждение компилятора (уровень 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;
}