为什么我不能为C中函数外的全局变量赋值?

时间:2018-06-02 21:20:00

标签: c scope global-variables

假设我有一个全局变量,我想为它分配另一个变量。我发现你可以为函数内的全局变量分配另一个值:

int i = 8;

int main(void)
{
  i = 9;     /* Modifies i */
  return 0;
}

但是,在函数外部分配全局变量不起作用!

int i = 8;

i = 9;  /* Compiler error */

int main(void)
{
  return 0;
}

我收到以下错误消息:

warning: data definition has no type or storage class
warning: type defaults to 'int' in declaration of 'i'
  error: redefinition of 'i'
note: previous definition of 'i' was here
int i = 8;
    ^

为什么会这样?

1 个答案:

答案 0 :(得分:4)

这是全局变量的定义,可选的初始化为特定值:

int i = 8;

请注意,它不是可执行的代码,变量只会被设置为最初包含8.要么将其视为“魔法”(对于许多未经标准定义的事物的有用模型)或者想到在执行任何代码之前将值复制到内存位置的表

这是一段代码,没有执行它的“框架” (或者你打算成为。编译器有其他意见,见下文。)

i = 9;

没有包含它的功能。目前尚不清楚何时应该执行。这就是编译器不喜欢的。
在C中,所有代码都必须在函数内部,并且只有在调用该函数时才会执行,例如,来自main()

其他语言,主要是通过解释它们来执行“脚本”的语言(而不是将代码转换为可执行程序,例如通过编译器)允许在任何地方使用代码。 C是不同的。

编译器对此的看法不同:

i = 9;
  • 它不在函数内部,所以它不能是代码
  • 它看起来像一个变量定义,假设你的意思是int,即默认
  • 但依赖默认值并不是一个好主意,因此警告缺少类型并使用默认值
  • 另外,如果一个定义,那么它是i的第二个,现在确实是错误的,所以显示错误并且编译失败
  • 只是为了提供帮助,请提及i的第一个定义

这是如何读取您引用的编译器输出。