在C++中创建静态全局变量时

Mir*_*pas 10 c++ language-lawyer

我知道全局变量是按相同编译单元的声明顺序创建的,并且未在多个编译单元之间定义创建顺序.

我前段时间读过,全局变量是在调用定义它们的编译单元中的任何代码之前创建的.这是由标准定义的吗?

例:

file1.cpp

int f1v1 = f1_1();
int f1v2 = f1_2();

void f1(){...}

int f1_1(){...}
int f1_2(){...}
Run Code Online (Sandbox Code Playgroud)

file2.cpp

static int f2v1 = f2_1();
static int f2v2 = f2_2();

int f2_1(){...}
int f2_2(){...}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "file1.h"
#include "file2.h"

int main()
{
    f1();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,f1_1()是否由之前f1_2()和之前调用的标准保证f1()?由标准,保证f2_1()f2_2()被称为可言,因为没有在file2.cpp定义的函数被调用,f2v1并且f2v2是不可见的外file2.cpp?

编辑:

当在lib1中编译file1.cpp并且在lib2中编译file2.cpp时,标准是否指定了行为?

Rei*_*ica 4

基于[basic.start.init]:

f1_1()保证在之前执行f1_2()(第 2 段:“在单个翻译单元中定义的具有有序初始化的变量应按照其在翻译单元中的定义顺序进行初始化。”)。

两者都保证在之前执行f1()(第 4 段:“如果初始化被推迟到 main 的第一个语句之后的某个时间点,则它应在同一定义中定义的任何函数或变量的第一个 odr-use (3.2) 之前发生。翻译单元作为要初始化的变量。”)。

关于f2_1()f2_2(),[basic.stc.static]para.2 说“如果具有静态存储持续时间的变量具有初始化或具有副作用的析构函数,即使它看起来未使用,也不会被消除,......”。这意味着如果它们包含副作用,则保证会被调用。