Aviso do compilador (nível 4) C4459
a declaração de 'identifier' oculta uma declaração global
A declaração do identifier no escopo local oculta a declaração do identifier de nome idêntico no escopo global. Este aviso permite que você saiba que as referências a identifier neste escopo resolvem para a versão declarada localmente, não para a versão global, o que pode ou não ser a sua intenção. Em geral, recomendamos que você minimize o uso de variáveis globais como uma boa prática de engenharia. Para minimizar a poluição do namespace global, recomendamos o uso de um namespace nomeado para variáveis globais.
Esse aviso era novo no Visual Studio 2015, no compilador do Microsoft C++ versão 18.00. Para suprimir avisos dessa versão do compilador ou posterior durante a migração do código, use a opção do compilador /Wv:18.
Exemplo
O exemplo a seguir gera o aviso 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;
}
Uma maneira de corrigir esse problema é criar um namespace para seus globais, mas sem usar uma diretiva using
para colocar esse namespace no escopo, para que assim todas as referências devam usar os nomes qualificados inequívocos:
// 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;
}