在声明时值初始化全局变量

Value-initializing global variables at declaration

我阅读了一些关于在声明时为全局变量赋值的相互矛盾的信息。

有些人似乎允许这样做:

int g_int = 5;

而其他人说它必须在 main 中初始化:

int g_int;
int main() { 
    g_int = 5; 
}

我个人在 Visual Studio 2008–2013 年使用第一种样式没有任何问题。

首先,int g_int = 5;(和int g_int;)不是声明,而是定义。

Is this legal C++?

是的,g_int 将用值 5 初始化。 (顺便说一句:对于 int g_int; g_int 将使用值 0 进行初始化。)

If it is legal, is assignment of a function result also legal, with the function call guaranteed to be executed before main? E.g. time_t g_starttime = time();?

是的,有保证。

顺便说一句:main() 中的 g_int = 5; 不是初始化,只是赋值。这意味着如果在输入 main() 之前使用 g_int,将使用默认值 0(而不是 5)。

others say it must be initialized in main

"Others" 是错误的:虽然翻译单元内定义的变量肯定 可以 main 中分配,但它们不会 必须在 main.

中分配

这在 C++ 中是完全合法的。函数结果的赋值也是合法的,并且保证在进入main.

之前进行初始化

此外,如果您在同一个翻译单元内(即在同一个 CPP 文件内)有多个初始化声明,它们保证按文本顺序执行。如果你这样做

int twoTimes(int i) {
    cout << "Doubling " << i << endl;
    return 2*i;
}
int a = twoTimes(7);
int b = twoTimes(8);
int main() {
    ...
}

输出保证为

Doubling 7
Doubling 8