关于c ++:如何在clang中处理全局构造函数警告?

How to deal with global-constructor warning in clang?

Clang警告(当使用-WeverythingWglobal-constructors时)关于静态对象的构造函数。

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

为什么这是相关的,应该如何处理这个警告?

简单示例代码:

1
2
3
4
5
6
7
class A {
  // ...
  static A my_A;
  A();
};

A A::my_A; // triggers said warning


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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-global-constructors禁用警告。 或者您可以更改为这样的延迟初始化方案:

1
2
3
4
5
6
A&
my_A()
{
    static A a;
    return a;
}

这完全避免了这个问题(并且抑制了警告)。


来自@Howard Hinnant的解决方案避免使用全局构造函数,但它仍然会退出析构函数。
它可以通过选项-Wexit-time-destructors找到

所以理想的解决方案可以基于http://src.chromium.org/svn/trunk/src/base/basictypes.h中的CR_DEFINE_STATIC_LOCAL。

1
2
3
4
5
A& my_A()
{
    static A &a = *new A;
    return a;
}