c++ 内联变量的初始化顺序

h5qlskok  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(145)

假设我有以下三个文件。
标题.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;

我是否可以保证abc之前初始化,从而导致b == a + 5c == a + 3
我的理解是,在一个编译单元中,我确实可以保证文件作用域变量是按照从上到下的顺序初始化的,但是这种保证是否可以扩展到内联变量,因为它们只存在一次,即使它们是在多个编译单元中定义的。
我知道我不能保证'b'和'c'的相对顺序,但这不是一个问题,因为它们彼此不依赖。

llycmphe

llycmphe1#

是的,我保证。
https://en.cppreference.com/w/cpp/language/initialization#Dynamic_initialization
1.* 偏序动态初始化 ,适用于所有不是隐式或显式示例化的专用化的内联变量。如果在每个翻译单元中偏序V定义在有序或偏序W之前,则V的初始化排序在W的初始化之前(或如果程序启动线程,则在之前发生)。
1.
有序动态初始化 *,适用于所有其他非局部变量:在一个翻译单元中,这些变量的初始化总是按照它们的定义在源代码中出现的精确顺序来排序。2不同翻译单元中的静态变量的初始化是不确定顺序的。3不同翻译单元中的线程局部变量的初始化是无序的。
(bold地雷)

相关问题