如何应对全球构造函数铛警告?(How to deal with global-constructor

2019-08-18 06:45发布

铛警告(当使用-WeverythingWglobal-constructors )约构造函数的静态对象。

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

为什么这是相关的,一个人应该如何对待这个警告?

简单的示例代码:

class A {
  // ...
  static A my_A;
  A();
};

A A::my_A; // triggers said warning

Answer 1:

这里是一个触发相同的警告简单的情况:

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.

这是完全合法和安全的C ++。

然而,对于你有充分的不平凡的全局构造,应用程序的启动时间受到影响。 警告仅仅是让你知道这个潜在的性能问题的一种方式。

您可以禁用与-Wno-全球构造的警告。 或者,你可以改变这样的延迟初始化方案:

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

这就避免了问题完全(和抑制警告)。



Answer 2:

从@Howard Hinnant(欣南特)解决方案避免全球构造,但它做退出的时候析构函数依然。 它可以与选项中找到-Wexit-time-destructors

所以,理想的解决方案可以根据CR_DEFINE_STATIC_LOCAL从http://src.chromium.org/svn/trunk/src/base/basictypes.h

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


文章来源: How to deal with global-constructor warning in clang?
标签: c++ clang