Clang警告(当使用-Weverything
或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
答案 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;
}