假设我有一个全局变量,我想给它分配另一个变量。我发现你可以为函数中的全局变量赋值:
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;
^
为什么会这样?
这是全局变量的定义,可选择初始化为特定值:
int i = 8;
请注意,执行的不是代码,变量将设置为最初包含 8。要么将其视为"魔术"(对于许多未真正由标准定义的事情的有用模型(,要么考虑在执行任何代码之前将值复制到内存位置的表。
这是一段没有执行它的"框架"的代码。
(或者你打算这样做。编译器有其他意见,见下文。
i = 9;
没有包含它的函数。目前尚不清楚何时应该执行。这是编译器不喜欢的。
在 C 中,所有代码都必须位于函数内部,并且只有在调用该函数时才会执行,例如从main()
.
其他语言,主要是那些通过解释来执行"脚本"的语言(而不是将代码转换为可执行对象,例如由编译器(允许在任何地方都有代码。C 是不同的。
编译器对此有不同的看法:
i = 9;
- 它不在函数内部,因此它不能是代码
- 它看起来像一个变量定义,假设你的意思是它是一个
int
,即默认的 - 但是依赖默认值不是一个好主意,所以警告缺少类型并使用默认值
- 另外,如果它是一个定义,那么它是
i
的第二个,现在这确实是错误的,所以显示错误并编译失败 - 为了有所帮助,请提及
i
的第一个定义在哪里
这就是读取您引用的编译器输出的方法。