Инициализация статических членов
От: KPavel Россия  
Дата: 25.07.03 17:39
Оценка:
Всем привет!

В книге Страуструпа ("Язык программирования С++", спец. издание, гл. 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, или как вообще?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.