1. ホーム
  2. c++

[解決済み】clangでglobal-constructorの警告に対処する方法は?

2022-02-05 10:02:25

質問

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

これは完全に合法的で安全なC++です。

しかし、非自明なグローバルコンストラクタがあるたびに、アプリケーションの起動時間が低下します。 警告は、この潜在的なパフォーマンスの問題を知らせるためのものです。

この警告は -Wno-global-constructors で無効にすることができます。 あるいは、次のような遅延初期化スキームに変更することもできます。

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.

を使えば、この問題を完全に回避することができます(警告も表示されません)。