在声明时值初始化全局变量
Value-initializing global variables at declaration
我阅读了一些关于在声明时为全局变量赋值的相互矛盾的信息。
有些人似乎允许这样做:
int g_int = 5;
而其他人说它必须在 main 中初始化:
int g_int;
int main() {
g_int = 5;
}
我个人在 Visual Studio 2008–2013 年使用第一种样式没有任何问题。
- 这是合法的 C++ 吗?
- 如果它没有在 C++ 中定义,它在 MSVC 和 g++ 中是否仍然是编译器定义的行为?
- 如果合法,函数结果的赋值是否也合法,保证函数调用在
main
之前执行?例如。 time_t g_starttime = time();
?
首先,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
我阅读了一些关于在声明时为全局变量赋值的相互矛盾的信息。
有些人似乎允许这样做:
int g_int = 5;
而其他人说它必须在 main 中初始化:
int g_int;
int main() {
g_int = 5;
}
我个人在 Visual Studio 2008–2013 年使用第一种样式没有任何问题。
- 这是合法的 C++ 吗?
- 如果它没有在 C++ 中定义,它在 MSVC 和 g++ 中是否仍然是编译器定义的行为?
- 如果合法,函数结果的赋值是否也合法,保证函数调用在
main
之前执行?例如。time_t g_starttime = time();
?
首先,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