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

Gal*_*axy 2 c scope global-variables

假设我有一个全局变量,并且想为其分配另一个变量。我发现您可以将另一个值分配给函数内的全局变量:

int i = 8;

int main(void)
{
  i = 9;     /* Modifies i */
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

int i = 8;

i = 9;  /* Compiler error */

int main(void)
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

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;
    ^
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?

Yun*_*sch 5

这是对全局变量的定义,可以将其初始化为特定值:

int i = 8;
Run Code Online (Sandbox Code Playgroud)

请注意,并不是代码会被执行,该变量将被设置为最初包含8。要么将其视为“魔术”(对许多标准未真正定义的事物有用的模型),要么考虑带有值的表在执行任何代码之前将其复制到内存位置。

这是一段没有执行“框架”的代码。
(或者您打算这样做。编译器有其他意见,请参见下文。)

i = 9;
Run Code Online (Sandbox Code Playgroud)

没有包含它的函数。目前尚不清楚何时执行。那就是编译器不喜欢的东西。
在C语言中,所有代码都必须在函数内部,并且仅在调用该函数(例如从)时才执行main()

其他语言,大多数是通过解释来执行“脚本”的语言(而不是例如通过编译器转换成可执行代码的语言)允许在任何地方使用代码。C是不同的。

编译器对此有不同的看法:

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

这就是读取引用的编译器输出的方法。