Всем привет!
В книге Страуструпа ("Язык программирования С++", спец. издание, гл. 21.5.2) приводится способ однократной инициализации библиотеки на основе статического счетчика объектов. Да и здесь эта тема обсуждалась (
здесьАвтор: Курилка
Дата: 12.02.02
).
Допустим:
[some.h]
class c_some
{
public:
static int x;
c_some(void);
};
[some.cpp]
#include "some.h"
int c_some::x = 0;
c_some::c_some(void)
{
// использование x
}
[test.cpp]
#include "some.h"
c_some some;
Вопрос — а где гарантия, что c_some::x будет инициализирован до создания первого объекта c_some?
Что происходит, если первый объект c_some также создается глобально, или в конструкторе глобального объекта другого класса? Получается, что для того, чтобы этот прием работал, должен быть определенный порядок инициализации —
int c_some::x = 0 (some.cpp) должно выполниться раньше, чем c_some some (test.cpp).
Это что же, линкер должен соответствующим образом разместить данные в .cinit, или как вообще?