全局变量初始化

时间:2012-08-07 08:49:42

标签: c++

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

以上是我的讲师给出的课堂笔记。

#include <iostream>

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

我运行时出错。在调用main()之前将'b'分配给100是不是真的?错误是C++ requires a type specifier for all declarations

5 个答案:

答案 0 :(得分:5)

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

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

您可以通过将b的定义/初始化移至main之前来解决此问题:

#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时,这两个解决方案都不会更改,只需在b内提供main

答案 1 :(得分:2)

问题在于:cout<<b<<endl;

在声明声明之前,您无法访问该变量。

答案 2 :(得分:2)

仔细阅读。

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

要正确编译B应该在第一次使用之前定义(并声明)(这是你的错误:B在被声明之前被使用过。)

答案 3 :(得分:2)

你的讲师错了;全局变量按定义的顺序初始化,而不是声明

例如,

#include <iostream>
struct S { S(const char *s) { std::cout << s << '\n'; } };
extern S a;    // declaration
extern S b;    // declaration
int main() { }
S b("b");      // definition
S a("a");      // definition

将打印

b
a

您发布的代码不起作用,因为b在使用时甚至没有声明。声明(例如,extern int b)是必需的,因为C ++(如C)最初设计为one-pass compiler

答案 4 :(得分:0)

问题是语句b=100;:不能在全局范围内放置语句(变量初始化除外)。

如果此行保持原样,无论 b 声明/定义如何或在 b 内或任何地方使用 main,代码都不会编译。

没有这一行,代码是正确的并且可以工作,b 的值等于 0,因为未初始化的全局变量被初始化为 0(或者 b=100; 行可以移动到任何函数作用域)。