全局变量初始化

新手上路,请多包涵

原则上,在调用 main() 之前初始化在任何函数之外定义的变量(即全局、命名空间和类静态变量)。翻译单元中的此类非局部变量按其声明顺序初始化

以上是我的讲师课堂笔记中的台词。

 #include <iostream>

using namespace std;
int a=99;
int main(int argc, char *argv[])
{
  cout<<a<<endl;
  cout<<b<<endl;
  return 0;
}
int b=100;

运行此程序时出现错误。 --- 在调用 main() 100 b 真的吗?

原文由 tez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 671
2 个回答

这里的问题不是初始化顺序: b 确实在 main 开始运行之前被初始化。

问题是 b 的“可见性”。在编译 main _时_,没有 b

您可以通过将 --- 的定义/初始化移动到 main b 之前来修复它:

 #include <iostream>

using namespace std;
int a = 99;
int b = 100;
int main (int argc, char *argv[]) {
    cout << a << '\n';
    cout << b << '\n';
    return 0;
}

或者简单地指出 b 存在:

 #include <iostream>

using namespace std;
int a = 99;
extern int b;
int main (int argc, char *argv[]) {
    cout << a << '\n';
    cout << b << '\n';
    return 0;
}
int b = 100;

b 在运行时创建或初始化时,这两种解决方案都不会改变,它们只是使 bmain --- 中可用。

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 3.0 许可协议

仔细阅读。

在调用 main (未编译)之前初始化在任何函数 (B) 之外定义的变量。

要正确编译 B 应该在第一次使用之前定义(和声明)(这是你的错误:在任何地方声明之前使用 B )。

原文由 Heisenbug 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏