以下是一个非常简单的c ++代码:-
#include <iostream>
using namespace std;
int i;
i = 2; //error at line 5
int main()
{
cout << i << endl;
return 0;
}
由于第5行,总共产生3个错误:-
此声明没有存储类或类型说明符
缺少类型说明符-假定为int。注意:C ++不支持default-int
'int i':重新定义
我知道第5行在语法上是错误的,但是我找不到任何原因。
我刚刚从 Herbert Schildt 的《 C ++:完全参考》 一书中开始学习C ++。在第2章中,在理解 extern 关键字的同时,
声明声明对象的名称和类型。定义导致为对象分配存储空间。
据此,我推断{type} {variable_name}形式的语句是声明,而 first赋值语句即{variable_name} = {first_value}可以视为定义。>
但是对于全局变量,声明是定义,因为声明如果未初始化,则会被赋予默认值。因此,在给定的代码中,在第4行,我应该使用默认值0进行初始化,然后在第5行,给我另一个值,即2 但在main()之外。
通常,全局变量在main内部初始化,并且不能为main外部分配这样的值。如果对其他任何类型的变量(例如局部变量)执行相同的操作,则不会引发错误。
在this thread中提出了类似的问题。
我无法完全理解answer given by paxdiablo。它说在main()被编译之前,没有b 并给出了2个解决方案。要么在调用main()之前在声明变量b时将其尾部化,要么使用extern告诉编译器变量b在其他地方使用。
我使用前一种解决方案的方式略有不同。首先,我声明了全局变量i,然后在调用main()之前为其分配了一个值。
所以,为什么不能在main()之外的单独一行代码中定义全局变量(无论是否静态)或将其分配给值即使分配是在main()之前完成的?