Clang warns (when using -Weverything or Wglobal-constructors) about constructors for static objects.
warning: declaration requires a global constructor [-Wglobal-constructors] A A::my_A; // triggers said warning ^~~~ Why is this relevant and how should one deal with this warning?
Simple example code:
class A { // ... static A my_A; A(); }; A A::my_A; // triggers said warning 73 Answers
Here is a simpler case that triggers the same warning:
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. This is perfectly legal and safe C++.
However for every non-trivial global constructor you have, launch time of your application suffers. The warning is simply a way of letting you know about this potential performance problem.
You can disable the warning with -Wno-global-constructors. Or you can change to a lazy initialization scheme like this:
A& my_A() { static A a; return a; } which avoids the issue entirely (and suppresses the warning).
6Solution from @Howard Hinnant avoid global constructor, but it do exit time destructor still. It can be found with option -Wexit-time-destructors
So Ideal solution can be based on CR_DEFINE_STATIC_LOCAL from
A& my_A() { static A &a = *new A; return a; } 7If you can declare the constructor constexpr, that will suppress the warning (because this guarantees constant initialization). See