我知道全局变量是按照同一编译单元的声明顺序创建的,而创建顺序在多个编译单元之间没有定义。
我前段时间读到全局变量是在调用定义它们的编译单元中的任何代码之前创建的。这是标准定义的吗?
例子:
文件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 中定义的函数和 f2v1
和 f2v2
在 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/