extern变量初始化顺序疑问:是否保证在main函数前完成初始化?
全局变量初始化是否保证在main函数前完成?
你完全可以放心,这个程序的输出始终会是44,C++标准明确保证了这一点,下面我来给你拆解原因:
- 全局变量的存储期与初始化时机:你的变量
a是全局变量,属于静态存储期的变量(包括全局变量、static修饰的变量)。根据C++标准,所有静态存储期的变量都会在main()函数开始执行之前完成初始化——这个阶段属于程序的启动阶段,早于main函数的入口点。 - 常量初始化的确定性:在你的代码里,
a被初始化为44,这属于常量初始化(初始化值是编译期可确定的常量表达式)。这类初始化是程序启动时最早完成的初始化操作之一,完全不会出现“初始化晚于main调用”的问题。 - 跨编译单元的全局变量:哪怕
a的定义在1.cpp,而使用在2.cpp的main函数里,标准依然保证所有全局变量的初始化都在main之前完成。不同编译单元的全局变量初始化顺序可能有不确定性,但这只影响那些互相依赖的全局变量;而你的main函数只是直接读取a,不管其他全局变量的初始化顺序,a自身的初始化肯定已经完成了。
简单来说,只要是全局变量,不管在哪个文件里,它的初始化一定发生在main函数执行之前,所以你在main里打印a的时候,它的值必然是44。
内容的提问来源于stack exchange,提问作者Vishal Sharma
相关产品推荐
相关产品推荐

