Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
L’initialiseur global accède à l’objet extern 'symbol' (i.22)
Instructions principales C++ : I.22 : Éviter l’initialisation complexe d’objets globaux
Les objets globaux peuvent être initialisés dans un ordre incohérent ou non défini, ce qui signifie que l’interdépendance entre eux est risquée et doit être évitée. Cette directive s’applique lorsque les initialiseurs font référence à un autre objet considéré comme externétant .
Notes
Un objet est considéré extern comme conforme aux règles suivantes :
- il s’agit d’une variable globale marquée avec
externspécificateur ou d’un membre statique d’une classe ; - ce n’est pas dans un espace de noms anonyme ;
- il n’est pas marqué comme
const; - Les membres de classe statique sont considérés comme globaux, de sorte que leurs initialiseurs sont également vérifiés.
Nom de l’analyse du code : NO_GLOBAL_INIT_EXTERNS
Exemple
Vérification de version externe :
// 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 vérification de version externe a été plus fiable :
// 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;
}