Как бороться с предупреждением глобального конструктора в clang?

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

Ответы

Ответ 1

Вот более простой случай, который вызывает одно и то же предупреждение:

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.

Это совершенно законный и безопасный С++.

Однако для каждого нетривиального глобального конструктора, который у вас есть, время запуска вашего приложения страдает. Предупреждение - это просто способ сообщить об этой потенциальной проблеме производительности.

Вы можете отключить предупреждение с помощью -Wno-global-constructors. Или вы можете перейти к ленивой схеме инициализации следующим образом:

A&
my_A()
{
    static A a;
    return a;
}

который полностью исключает проблему (и подавляет предупреждение).

Ответ 2

Решение от @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;
}