Следующая заимствован из кода:Порядок присвоения переменной
компиляторvoid func()
{
static MyClass a = init_func();
a_global_var = null;
}
ли C++ гарантирует, что первое задание, перед 2-й?
Следующая заимствован из кода:Порядок присвоения переменной
компиляторvoid func()
{
static MyClass a = init_func();
a_global_var = null;
}
ли C++ гарантирует, что первое задание, перед 2-й?
Да. Но я содрогаюсь, чтобы подумать, почему вам нужно полагаться на это.
Первый раз, когда функция вызывается, a
инициализируется с тем, что возвращается из init_func
до того a_global_var
позже установлен в «null
»
Обратите внимание, что, как a
статично, это происходит только в первый раз, когда функция называется. Все последующие времена, a_global_var
устанавливается в null
без каких-либо изменений в a
этой функцией.
Спасибо за ваш быстрый ответ, я только что обновил свой вопрос, на самом деле эти 2 заявления находятся вне любой функции. –
Использование статической переменной в функции является довольно нормальным шаблоном –
@MattMcNabb Использует статическую переменную в функции, которая требует, чтобы глобальная переменная была вручную установлена на нуль после обычного шаблона? –
«Компилятор C++ гарантирует, что первое задание до второго?»
Да, это гарантировано.
В любом случае вы должны рассмотреть, чтобы справиться с этим в одноточечного (если вам действительно нужно, чтобы он глобально доступен):
class MyClass {
public:
static MyClass& instance() { // <<< replaces func()
static MyClass a;
return a;
}
void* global_var() { return a_global_var; }
private:
MyClass() : a_global_var(nullptr) { // <<< replaces init_func()
}
void* a_global_var;
};
Первая строка не является «назначение». Это инициализация . Так как это инициализация объекта static, объявленного в области блока, он будет выполняться только один раз, когда элемент управления пройдет его в первый раз, то есть когда вы вызываете свою функцию в первый раз.
Вторая строка - действительно задание. Он будет выполняться каждый раз, когда элемент управления проходит через него, т. Е. Каждый раз, когда вы вызываете свою функцию.
Это означает, что ваш вопрос имеет смысл только в первый раз, когда эта функция вызывается. В этом случае завершение инициализации будет предшествовать назначению. Во всех последующих вызовах вопрос не будет применяться вообще, так как инициализация больше не будет выполняться.
Вы должны задать новый вопрос, а не редактировать текущий. Теперь мой ответ не имеет смысла. –
Я возвращаю изменения, это должен быть новый вопрос. Более того, ваш модифицированный код больше не будет компилироваться, потому что вы не можете выполнять произвольные назначения вне функций. – Praetorian