Compartilhar via


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;
}