Avertissement C26427
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
extern
spé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 case activée.
Nom de l’analyse du code : NO_GLOBAL_INIT_EXTERNS
Exemple
Version externe case activée :
// 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 version externe case activée rendu 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;
}
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : pendant toute l’année 2024, nous allons éliminer progressivement Problèmes GitHub comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, voir :Soumettre et afficher des commentaires pour