Partilhar via


Aviso do compilador (nível 4) C4459

declaração de «identificador» oculta declaração global

Observações

A declaração de identificador no escopo local oculta a declaração do identificador de nome idêntico no escopo global. Este aviso informa que as referências ao identificador neste escopo resolvem-se para a versão declarada localmente, não para a versão global, o que pode não corresponder à sua intenção. Geralmente, 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.

Este aviso era novo no Visual Studio 2015, no compilador 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 de compilador /Wv:18 .

Example

O exemplo a seguir gera 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 este problema é criar um namespace para as suas variáveis globais, mas não usar uma diretiva using para trazer esse namespace para o escopo; portanto, todas as referências devem utilizar nomes qualificados e 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;
}