繁体   English   中英

c ++在“本地范围”中初始化静态变量

[英]c++ initialization static variable in "local scope"

静态变量在程序开始时被初始化,如这里所述,静态变量的初始化顺序是未定义的。 因此,用另一个静态变量初始化一个静态变量可能会导致程序崩溃。

在函数中声明的“本地”静态变量也是如此吗?

使用全局声明的静态变量来初始化“本地”静态变量是否安全?

如果我在同一个局部范围内有多个静态变量,使用早期声明的变量来初始化后期声明的变量是否安全?

具有静态存储持续时间的变量,其中初始值在编译时已知, 零初始化常量初始化是静态初始化并在其他一切之前初始化(在 C++11 和更早的标准修订版中, 零初始化在常量初始化之前)。 毕竟,如果编译器和链接器在编译时确切地知道该变量的值是什么,他们为什么不把值放在那里呢?

静态初始化的变量不是问题。 如果您要分配常数或零,则该变量不依赖于其他任何东西。 剩下动态初始化,如果我正确阅读 C++ 标准中的[basic.start.static] ,静态初始化都发生在任何翻译单元中的任何动态初始化之前。 问题在于动态初始化的变量具有跨多个翻译单元交互的静态存储持续时间。 您可以按照定义的顺序保证翻译单元内的初始化顺序,但不能保证翻译单元的初始化顺序。

在函数中声明的“本地”静态变量也是如此吗?

不, static局部变量有一个明确定义的初始初始化顺序。 动态初始化将在第一次使用时发生,并且它们不能跨翻译单元拆分,这消除了非本地初始化顺序中的歧义。

如果我在同一个局部范围内有多个静态变量,使用早期声明的变量来初始化后期声明的变量是否安全?

是的。 同样,我们有一个明确定义的初始化顺序。 动态初始化的变量将按顺序初始化,静态初始化的变量已经初始化。 你可以用一个线程来解决这个问题,但是 C++11 更好地确保一个线程不能中断静态变量的初始化。 如果一个线程在两个静态变量的初始化之间中断,这取决于你是否安全,但第一个变量仍然会在第二个变量之前被初始化。

使用全局声明的静态变量来初始化“本地”静态变量是否安全?

不总是。 main之前分配和初始化非局部变量,因此通常在您有机会调用包含静态局部变量的函数之前,它们已被初始化并准备好使用。

但是如何使用包含静态变量的函数进行初始化,该变量取决于来自不同翻译单元的变量?

在 A.cpp 中说我们有

int A_variable  = something_dynamic();

在 B.cpp 中,我们有

int  func()
{
    static int local_static = A_variable;
    return local_static;
}
int B_variable = func();

B_variable初始化可能发生在A_variable初始化之前。 这将调用func并将local_static设置为B_variable尚未定义的值。 哎呀。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM