29

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
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 に答える