#include<stdio.h>
int i =0;
i=2;
int main(){
// some Code here
return 0;
}
错误: /Users/vaibhavkumar/Documents/C/primeFactors.c|4|error: redefinition of 'i'|
- 为什么c中不允许重新定义变量?
- 全局变量存储在数据段(内存区域),与静态变量存储在同一位置。为什么静态变量可以被重新声明?
这不是重定义,而是赋值。
赋值与C中的初始化不一样,不能在函数之外完成——在那个上下文中没有执行线程,那么什么时候完成呢?
在这方面,具有static
链接的变量与具有extern
链接的全局变量没有什么不同,但是静态链接变量对于单个编译单元来说是局部的,并且在外部不可见。如果在不同的编译单元中声明两个相同名称的静态变量,它们是完全独立且不相关的变量——它们甚至不必是相同的类型。
注意静态链接与静态存储不同,但它们使用相同的关键字。所有全局和静态链接变量都隐式地具有静态存储类,但是声明为静态的函数局部变量具有静态存储类 -即它始终存在-就像全局变量一样,但仅在局部可见。
Clifford解释了赋值和初始化的区别。但在完整性之前:不允许在函数之外赋值。只有初始化。
但是为什么会出现这个奇怪的错误呢?这是因为隐式声明。
如果我们讨论的是全局空间,那么这个
int i = 0;
i = 2;
实际上相当于:
int i = 0;
int i = 2;
这段代码将打印42:
#include <stdio.h>
i = 42;
int main(void) {
printf("%dn", i);
}
原因是向后兼容性。不要使用这个"功能"
这条看似毫不相关的奇怪消息背后的逻辑是这样的:
- 允许隐式声明
- 全局空间不允许赋值
- 因此,
i=2;
在全局空间中必须是声明