铛警告(当使用-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
这里是一个触发相同的警告简单的情况:
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;
}
这就避免了问题完全(和抑制警告)。
从@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;
}