Инициализировать статическую локальную переменную неизвестным значением во время компиляции


В языке 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 2

2 ответа:

Компилятор будет генерировать код не на основе его значения, а на основе потокобезопасного флага, который гарантирует, что код выполняется только один раз.

Что-то вроде этого:

void func()
{
    static int i;
    static bool i_initialized;
    if (!i_initialized) {
      i = some_other_func();
      i_initialized = true;
    }
}

За исключением того, что обычно это не bool, а потокобезопасный способ его тестирования.

Согласно коду, видимому при дизассемблировании и отладке скомпилированного кода g++, существует скрытая переменная, которая инициализируется в 0, а при запуске инициализации устанавливается в 1. Так что в следующий раз код инициализации не будет выполнен.