yuyi
知不可乎骤得,托遗响于悲风
在C++中,全局变量和静态变量(包括静态局部变量和静态全局变量)的初始化行为需要更精确地区分和理解。这里是详细说明:
main
函数之前被初始化。这种初始化是按照它们定义的顺序进行的,但这个顺序只在同一个编译单元(通常是一个源文件)内是确定的。跨编译单元的初始化顺序是未定义的。这意味着,如果一个全局变量依赖于另一个编译单元中全局变量的值,那么这种依赖关系是危险的,因为你不能保证两者的初始化顺序。#include <iostream>
int global_var = 10; // 静态初始化
int getNumber() {
return 5;
}
int main() {
static int static_global_var = getNumber(); // 动态初始化,但在main函数之前
std::cout << "Global var: " << global_var << std::endl;
std::cout << "Static global var: " << static_global_var << std::endl;
return 0;
}
void func() {
static int static_local_var = getNumber(); // 在首次调用func时动态初始化
}
在这个示例中,global_var
和static_global_var
在程序启动时被初始化,其中global_var
是静态初始化的,而static_global_var
的初始化可能需要在运行时进行,但仍然发生在main
函数执行之前。static_local_var
的初始化则会在函数func
首次被调用时进行。
因此,总结说全局变量和静态变量在“首次用到时才进行初始化”的描述只准确地适用于静态局部变量。其他静态存储期变量(包括全局变量和静态全局变量)通常在程序启动时初始化,具体时机取决于它们是否能够被静态初始化或者需要动态初始化。