Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O inicializador global acessa o 'símbolo' do objeto externo (i.22)
Diretrizes principais do C++: I.22: Evitar a inicialização complexa de objetos globais
Os objetos globais podem ser inicializados em uma ordem inconsistente ou indefinida, o que significa que a interdependência entre eles é arriscada e deve ser evitada. Esta diretriz é aplicável quando os inicializadores se referem a outro objeto considerado como extern.
Observações
Um objeto é considerado extern se estiver em conformidade com as seguintes regras:
- é uma variável global marcada com
externespecificador ou é um membro estático de uma classe; - não está em um namespace anônimo;
- não está marcado como
const; - Os membros da classe estática são considerados globais, portanto, seus inicializadores também são verificados.
Nome da análise de código: NO_GLOBAL_INIT_EXTERNS
Exemplo
Verificação de versão externa:
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode = api_version <= API_LEGACY_VERSION; // C26427, also stale value
Verificação de versão externa tornada mais confiável:
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode() noexcept
{
return api_version <= API_LEGACY_VERSION;
}