La façon de traiter avec global-constructeur d'avertissement dans clang?
Clang avertit (lors de l'utilisation de -Weverything
ou Wglobal-constructors
) sur les constructeurs pour les objets statiques.
warning: declaration requires a global constructor
[-Wglobal-constructors]
A A::my_A; //triggers said warning
^~~~
Pourquoi est-ce pertinent et comment doit-on traiter cet avertissement?
Exemple Simple de code:
class A {
//...
static A my_A;
A();
};
A A::my_A; //triggers said warning
- Peut-on voir l'avertissement, s'il vous plaît?
- est-ce dans un .h fichier?
- Vous avez un objet de l'Une à l'intérieur de la classe A. Comment cela fonctionne? N'est-il pas devenu récursive - même si l'objet est statique. Si il ya un seul my_A & le ressemble ne causera pas de problèmes, je ne peux toujours faire
A a;
& puis un.mY_A.my_A.my_A.my_A etc. - Pas de. C'est
static
. Il est déclaré dansclass A
, mais il ne réside pas dans chaqueclass A
. - Ce programme compile
struct A { static A s; }; A A::s; int main() { A a; a.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s; }
- c'est presque comme un C++ blague. Pourquoi quelqu'un voudrait-il avoir un objet statique à l'intérieur de lui-même? - Un
static
objet fait partie de l'class
, ne fait pas partie d'un objet particulier de la classe, c'est à dire pas à l'intérieur de lui-même. Néanmoins, vous pouvez y accéder que si c'est un membre d'un objet:A::s
etA().s
reportez-vous à la même (et unique) de l'objet (qu'il s'agisse du même typeA
ou pas). Avoir unstatic
membre du même type est un moyen d'implémenter un singleton. - J'ai vu que le modèle parfois utilisé pour créer un ensemble de statique instances avec des valeurs fixes. Sur le plan conceptuel, comme un enum sur les stéroïdes. Généralement, les constructeurs de classe sont privés, ainsi que les exposés de la statique sont disponibles pour l'usage externe.
Vous devez vous connecter pour publier un commentaire.
Ici est un cas plus simple qui déclenche le même avertissement:
C'est parfaitement légal et sûr C++.
Cependant, pour tous les non-trivial mondiale constructeur que vous avez, le temps de lancement de votre application en souffre. L'avertissement est tout simplement un moyen de vous laisser savoir à propos de ce potentiel problème de performance.
Vous pouvez désactiver le message d'avertissement avec -Wno-mondial des constructeurs. Ou vous pouvez changer d'initialisation système comme ceci:
qui évite le problème entièrement (et supprime l'avertissement).
Solution de @Howard Hinnant éviter mondiale constructeur, mais elle ne le temps de la sortie destructeur encore.
Il peut être trouvé avec option
-Wexit-time-destructors
Donc la solution Idéale peut être basée sur CR_DEFINE_STATIC_LOCAL de http://src.chromium.org/svn/trunk/src/base/basictypes.h
static unique_ptr<A>
(au lieu de lastatic A&
) à l'intérieur deA::my_A()
?std::cout
et amis (voirstd::ios_base::Init
).