C++中是否保证内联变量a在全局变量b、c之前初始化?
问题代码示例
header.h
int SomeFunction(); inline int a = SomeFunction();
file1.cpp
#include "header.h" int b = a + 5;
file2.cpp
#include "header.h" int c = a + 3;
问题解答
可以保证a会在b和c之前完成初始化,因此b == a + 5和c == a + 3的结果是确定的。
原因如下:
- C++标准规定,inline静态存储期变量的动态初始化(这里
a通过调用SomeFunction()完成初始化,属于动态初始化),会被安排在所有引用它的同翻译单元内静态变量的初始化之前。 - 虽然
a是inline变量,程序中仅存在一个实例,但在每个包含它的翻译单元(file1.cpp和file2.cpp)中,编译器都会确保a初始化完成后,才执行该翻译单元内依赖a的静态变量(b和c)的初始化。 - 即便
a的初始化实际只执行一次,无论哪个翻译单元先触发a的初始化,一旦完成,其他翻译单元中的b、c初始化时都会使用a的已初始化值。
你提到的单个编译单元内从上到下的初始化顺序规则,是inline变量跨单元初始化保证的补充:inline变量的特殊规则确保了跨单元场景下,依赖它的静态变量总能拿到已初始化的值,而b和c之间的相对顺序不影响结果,正如你所说无需顾虑。
内容的提问来源于stack exchange,提问作者dgnuff
相关产品推荐
相关产品推荐

