首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“本地范围”中的c++初始化静态变量

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

Stack Overflow用户
提问于 2020-02-07 23:51:37
回答 1查看 1.1K关注 0票数 2

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

它是否也适用于函数中声明的“本地”静态变量?

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

如果在同一个局部作用域中有几个静态变量,那么使用早期声明的变量来初始化晚声明的变量安全吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-08 00:43:39

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

静态初始化变量不是问题。如果您要赋值常量或零,则变量不依赖于其他任何内容。这就剩下了动态初始化,如果我在C++标准中正确地读取了C++,那么静态初始化在任何翻译单位中的任何动态初始化之前都会发生。问题是动态初始化变量与静态存储持续时间在多个转换单元之间进行交互。您可以按照定义的顺序保证转换单元内的初始化顺序,但不能保证转换单元初始化的顺序。

它是否也适用于函数中声明的“本地”静态变量?

不是的。static局部变量具有定义良好的初始初始化顺序。动态初始化将在第一次使用时发生,它们不能在翻译单元之间被分割,这就消除了非本地初始化顺序中的模糊性。

如果在同一个局部作用域中有几个静态变量,那么使用早期声明的变量来初始化晚声明的变量安全吗?

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

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

不总是这样。在main之前分配和初始化一个非局部变量,因此通常在您有机会调用包含静态局部变量的函数之前对它们进行初始化和准备使用。

但是,如何使用包含依赖于来自不同转换单元的变量的静态变量的函数初始化呢?

在A.cpp里我们有

代码语言:javascript
复制
int A_variable  = something_dynamic();

在B.cpp,我们有

代码语言:javascript
复制
int  func()
{
    static int local_static = A_variable;
    return local_static;
}
int B_variable = func();

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60122603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档