29

Clang 警告(当使用-Weverythingor时Wglobal-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
4

3 回答 3

27

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

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

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

于 2013-03-29T18:03:13.490 回答
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;
}
于 2013-11-06T03:23:22.723 回答
1

如果您可以声明构造函数constexpr,那将抑制警告(因为这保证了常量初始化)。见https://godbolt.org/z/s3hY83jdr

于 2021-12-26T16:54:42.093 回答