同一函数中的静态函数变量初始化顺序
Static function variable initialization order in the same function
请考虑以下几点。
void f() {
static A a;
static B b;
}
void g() {
static C c;
static D d;
}
void client() {
f();
g();
}
我知道我们可以将全局静态变量作为static local variable
函数。只有在我们调用函数时,才会初始化变量。这可以解决初始化顺序问题。a
和b
将在c
之前初始化,并在先调用f()
然后g()
时d
。
但是,当在同一个函数中定义局部静态变量时,它是否相同?a
保证在b
之前初始化吗?
引用
cpp偏好(强调我的(:
使用说明符在块范围内声明的变量
static
具有静态存储持续时间,但在控件首次通过其声明时进行初始化(除非它们的初始化是零或常量初始化,可以在首次输入块之前执行(。在所有进一步的调用中,将跳过声明。
由于控制是从上到动的,因此变量确实将按声明顺序初始化。
但是,当在同一个函数中定义局部静态变量时,它是否相同?a 是否保证在 b 之前初始化?
是的,这是有保证的。两者是一对声明语句,一般规则是语句按顺序执行:
声明[stmt.stmt]/1
除非另有说明,否则语句按顺序执行。
声明的相关"例外"部分由昆汀回答中的cpp偏好文章总结,或者如果一个人喜欢阅读stadnardese,在[stmt.dcl]/4中。
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持