Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
El inicializador global accede al objeto extern 'symbol' (i.22)
C++ Core Guidelines: I.22: Evitar la inicialización compleja de objetos globales
Los objetos globales se pueden inicializar en un orden incoherente o no definido, lo que significa que la interdependencia entre ellos es arriesgada y debe evitarse. Esta guía es aplicable cuando los inicializadores hacen referencia a otro objeto que se considera extern.
Comentarios
Se considera que un objeto es extern si se ajusta a las reglas siguientes:
- es una variable global marcada con
externel especificador o es un miembro estático de una clase; - no está en un espacio de nombres anónimo;
- no está marcado como
const; - Los miembros de clase estática se consideran globales, por lo que también se comprueban sus inicializadores.
Nombre de análisis de código: NO_GLOBAL_INIT_EXTERNS
Ejemplo
Comprobación de versiones externas:
// 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
La comprobación de versiones externa hizo más confiable:
// 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;
}