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()};