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