Инициализировать статическую локальную переменную неизвестным значением во время компиляции
В языке C, чтобы инициализировать статическую локальную переменную до значения, неизвестного во время компиляции, я обычно делаю что-то вроде этого (например):
void func()
{
static int var = INVALID_VALUE;
if (var == INVALID_VALUE)
var = some_other_func();
...
}
На языке C++ я могу просто сделать:
void func()
{
static int i = some_other_func();
...
}
Единственный способ (который я могу придумать) для компилятора C++ решить его должным образом, это заменить этот код механизмом, подобным приведенному выше примеру C.
Но как компилятор определит" правильное " недопустимое значение? Или есть другой способ что я не принял во внимание?
Спасибо
Уточнение:
INVALID_VALUE
это значение, которое функция some_other_func
никогда не возвращает.
Он используется для того, чтобы гарантировать, что эта функция никогда не вызывается более одного раза.
2 ответа:
Компилятор будет генерировать код не на основе его значения, а на основе потокобезопасного флага, который гарантирует, что код выполняется только один раз.
Что-то вроде этого:
void func() { static int i; static bool i_initialized; if (!i_initialized) { i = some_other_func(); i_initialized = true; } }
За исключением того, что обычно это не bool, а потокобезопасный способ его тестирования.