meaning installed for berserk c++ clang

c++ - installed - ¿Cómo lidiar con la advertencia de constructor global en clang?



clang windows (2)

Clang advierte (cuando se usa -Weverything o Wglobal-constructors ) sobre constructores para objetos estáticos.

warning: declaration requires a global constructor [-Wglobal-constructors] A A::my_A; // triggers said warning ^~~~

¿Por qué es relevante y cómo se debe tratar con esta advertencia?

Código de ejemplo simple:

class A { // ... static A my_A; A(); }; A A::my_A; // triggers said warning


Aquí hay un caso más simple que dispara la misma advertencia:

class A { public: // ... A(); }; A my_A; // triggers said warning test.cpp:7:3: warning: declaration requires a global constructor [-Wglobal-constructors] A my_A; // triggers said warning ^~~~ 1 warning generated.

Esto es perfectamente legal y seguro C ++.

Sin embargo, por cada constructor global no trivial que tenga, el tiempo de inicio de su aplicación se ve afectado. La advertencia es simplemente una forma de informarle sobre este posible problema de rendimiento.

Puede deshabilitar la advertencia con -Wno-global-constructors. O puede cambiar a un esquema de inicialización perezoso como este:

A& my_A() { static A a; return a; }

lo que evita el problema por completo (y suprime la advertencia).


La solución de @Howard Hinnant evita el constructor global, pero sigue siendo el destructor del tiempo de salida. Se puede encontrar con la opción -Wexit-time-destructors

La solución ideal puede basarse en CR_DEFINE_STATIC_LOCAL de http://src.chromium.org/svn/trunk/src/base/basictypes.h

A& my_A() { static A &a = *new A; return a; }