How to deal with global-constructor warning in clang?

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 
7

3 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).

6

Solution 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; } 
7

If you can declare the constructor constexpr, that will suppress the warning (because this guarantees constant initialization). See

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like