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

Static function variable initialization order in the same function

本文关键字:变量 初始化 顺序 静态函数 函数      更新时间:2023-10-16

请考虑以下几点。

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

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

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

引用

cpp偏好(强调我的(:

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

由于控制是从上到动的,因此变量确实将按声明顺序初始化。

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

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

[stmt.stmt]/1

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

声明

声明的相关"例外"部分由昆汀回答中的cpp偏好文章总结,或者如果一个人喜欢阅读stadnardese,在[stmt.dcl]/4中。