c++ - 在声明时对全局变量进行值初始化

标签 c++ initialization global-variables variable-assignment variable-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();

最佳答案

others say it must be initialized in main

“其他”是错误的:虽然翻译单元内定义的变量当然可以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

关于c++ - 在声明时对全局变量进行值初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38877371/

相关文章:

c++ - 将指针从 C++ 传递到 Python/w boost python?

c++ - 使用 std::cin 中的 std::setw 限制输入大小

c++ - 如何使用 gnu_parallel 运行多个可执行文件和/或 bash 脚本?

javascript - Chrome扩展程序突然出现错误: "cannot access before initialization"

c# - Winform 变量作用域

c++ - 编译gcc 5.4.0后要导出的头文件夹

c - 按递减顺序求减法

c++ - 初始化模板内部类的静态成员

c - 仅当不存在 extern 关键字时,在头文件中定义变量才有效?

python - 在模块函数调用之间存储状态