C++中静态变量的存储位置是什么时候确定的?

我有以下简单的程序:

int main()
{
    int x = 5;
    static int y = x;
    return (0);
}

用 gcc 编译它,它会产生该行的错误,static int y = x;因为“初始化元素不是常量”。我认为这是由于它y是一个静态变量,在编译时需要知道其存储位置(数据/bss)和初始值。

但是,当使用 g++ 编译时,我没有收到任何错误并且程序运行良好(y打印出 5 个)。

我的问题是:

  1. 我的假设正确吗?
  2. 如果是这样,为什么可以在 C++ 中对静态变量进行这样的初始化?

回答

您的程序在 C++ 中格式良好,因为具有静态存储持续时间的局部变量不是在启动期间初始化(常量表达式有一些例外;在此示例中不适用),但在第一次控制通过它们的声明时,此时初始化程序包含局部非静态变量 的表达式x很容易获得。

引用cppreference / 存储持续时间 - 静态局部变量[强调我的]

在块作用域中使用说明符 static 或 thread_local (C++11 起)声明的变量具有静态或线程 (C++11 起)存储持续时间,但在第一次控制通过它们的声明时被初始化(除非它们的初始化为零或常量初始化,可以在第一次进入块之前执行)。在所有进一步调用中,将跳过声明。

然而,C 中的静态初始化不遵循相同的规则;来自cppreference / C 语言 - 初始化:

初始化静态或线程本地存储持续时间的对象时,初始化程序中的每个表达式都必须是常量表达式或字符串文字。

因此,您的程序在 C 中格式错误。


回答

在 C++ 中,静态局部变量仅在第一次控制通过它们的声明时初始化一次。对于这种情况,ymain()被调用之后x被初始化,并且已经被初始化为 value 5,然后y也被初始化为5

在第一次控制通过他们的声明时被初始化

在C 中,静态变量在程序启动之前被初始化,即在main()被调用之前;y不能从局部变量初始化xmain()

它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次。


以上是C++中静态变量的存储位置是什么时候确定的?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>