C++中静态变量的存储位置是什么时候确定的?
我有以下简单的程序:
int main()
{
int x = 5;
static int y = x;
return (0);
}
用 gcc 编译它,它会产生该行的错误,static int y = x;因为“初始化元素不是常量”。我认为这是由于它y是一个静态变量,在编译时需要知道其存储位置(数据/bss)和初始值。
但是,当使用 g++ 编译时,我没有收到任何错误并且程序运行良好(y打印出 5 个)。
我的问题是:
- 我的假设正确吗?
- 如果是这样,为什么可以在 C++ 中对静态变量进行这样的初始化?
回答
您的程序在 C++ 中格式良好,因为具有静态存储持续时间的局部变量不是在启动期间初始化(常量表达式有一些例外;在此示例中不适用),但在第一次控制通过它们的声明时,此时初始化程序包含局部非静态变量 的表达式x很容易获得。
引用cppreference / 存储持续时间 - 静态局部变量[强调我的]
在块作用域中使用说明符 static 或 thread_local (C++11 起)声明的变量具有静态或线程 (C++11 起)存储持续时间,但在第一次控制通过它们的声明时被初始化(除非它们的初始化为零或常量初始化,可以在第一次进入块之前执行)。在所有进一步调用中,将跳过声明。
然而,C 中的静态初始化不遵循相同的规则;来自cppreference / C 语言 - 初始化:
初始化静态或线程本地存储持续时间的对象时,初始化程序中的每个表达式都必须是常量表达式或字符串文字。
因此,您的程序在 C 中格式错误。
回答
在 C++ 中,静态局部变量仅在第一次控制通过它们的声明时初始化一次。对于这种情况,y在main()被调用之后x被初始化,并且已经被初始化为 value 5,然后y也被初始化为5。
在第一次控制通过他们的声明时被初始化
在C 中,静态变量在程序启动之前被初始化,即在main()被调用之前;y不能从局部变量初始化x在main()。
它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次。