静态函数变量初始化顺序在同一个函数中

时间:2018-04-16 11:27:11

标签: c++

请考虑以下事项。

void f() {
    static A a;
    static B b;
}
void g() {
    static C c;
    static D d;
}

void client() {
    f();
    g();
}

我知道我们可以将全局静态变量放入 function 中作为static local variable。只有在调用函数时才会初始化变量。 这可以解决初始化顺序问题。 ab将在cd之前初次化,先调用f()然后g()

但是在同一个函数中定义局部静态变量时是否相同? 是a保证在b之前初始化吗?

2 个答案:

答案 0 :(得分:4)

引自cppreference(强调我的):

  

在块作用域中使用说明符static声明的变量具有静态存储持续时间但是在控件第一次通过其声明时初始化(除非它们的初始化为零或初始化初始化,这可以在首次输入块之前执行。在所有进一步的调用中,将跳过声明。

由于控制从上到下流动,变量确实会按声明顺序初始化。

答案 1 :(得分:2)

  

但是在同一个函数中定义局部静态变量时是否相同?保证在b之前初始化吗?

是的,这是有保障的。这两个是一对声明语句,一般规则是该语句按顺序执行:

  

[stmt.stmt]/1

     

除非另有说明,否则将按顺序执行语句。

声明声明的相关“除外”部分由Quentin's answer中的cppreference文章进行了总结,或者如果有人喜欢阅读stadnardese,请[stmt.dcl]/4