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

标签 c++ language-lawyer

我知道全局变量是按照同一编译单元的声明顺序创建的,而创建顺序在多个编译单元之间没有定义。

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

例子:

文件1.cpp

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

void f1(){...}

int f1_1(){...}
int f1_2(){...}

文件2.cpp

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

int f2_1(){...}
int f2_2(){...}

主要.cpp

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

int main()
{
    f1();

    return 0;
}

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

编辑:

在lib1中编译file1.cpp,在lib2中编译file2.cpp时,是否是标准规定的行为?

最佳答案

基于[basic.start.init]:

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

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

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

关于c++ - 在 C++ 中创建静态全局变量时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13700538/

相关文章:

c++ - windows编程如何让 "choose file"函数生效?

c++ - 类模板部分特化的参数列表的限制中是否存在 GCC 4.9.1 (5.1) 错误?

c++ - 在没有 std::launder 的情况下将 std::aligned_storage* 重新解释为 T* 是否违反严格别名规则?

c++ - 删除 null void* 指针是未定义的行为吗?

c++ - 查找数组开头和结尾的函数

c++ - 如果分配的内存在构造函数抛出异常后被释放

c++ - #include <cmath> 与 C++ 程序中的 #include <math.h>

c - scanf 'maximum field width' 包含空格?

c++ - MSVC 中的模板静态定义和显式特化实例化错误

c++ - 为什么在链接时不解析共享库的符号?