如何处理clang中的全局构造函数警告?

时间:2013-03-29 17:35:28

标签: c++ clang

Clang警告(当使用-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

2 个答案:

答案 0 :(得分:20)

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

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禁用警告。或者您可以更改为这样的延迟初始化方案:

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

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

答案 1 :(得分:5)

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

找到它

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

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