How to deal with global-constructor warning in clang?

后端 未结 2 1216
情深已故
情深已故 2020-12-06 09:31

Clang warns (when using -Weverything or Wglobal-constructors) about constructors for static objects.

warning: declaration requires          


        
相关标签:
2条回答
  • 2020-12-06 09:46

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

    0 讨论(0)
  • 2020-12-06 10:04

    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 http://src.chromium.org/svn/trunk/src/base/basictypes.h

    A& my_A()
    {
        static A &a = *new A;
        return a;
    }
    
    0 讨论(0)
提交回复
热议问题