Static variable may be dynamically initialized in this header file

Объявляю глобальную переменную-объект

// globals.h
extern A a;

// globals.cpp
A a(5);

IDE в h файле выдает предупреждение

Clang-Tidy: Static variable 'a' may be dynamically initialized in this header file

В чем криминал?


Ответы (1 шт):

Автор решения: Fat-Zer

Скорей всего сlang-tidy намекает на то, что неизвестно, в каком порядке будут инициализированы глобальные переменные с динамической инициализацией из разных модулей.

Так например, если в foo.cpp есть создание другого глобального объекта:

// extern A a;
// ...
Foo foo{a}

, то нет гарантий, что конструктор a будет вызван раньше, чем конструктор foo.


Не стоит использовать голые глобальные переменные. Сделай глобальные объекты одиночками и увидишь, что это хорошо. В самом примитивном варианте — используй синглтон Меера:

// globals.h

class Globals {
public:
  static A & instanceA();
}

// globals.cpp

A &Globals::instanceA() {
  static A a{5};
  return a;
}

// foo.cpp

Foo foo{Globals::instanceA()};
→ Ссылка