#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'|
答案 0 :(得分:3)
那不是重新定义它是赋值。
赋值与C中的 initialisation 不同,并且不能在函数外部完成 - 在该上下文中没有执行的线程,所以什么时候会完成?
在这方面,具有static
链接的变量与全局变量(具有extern
链接)没有区别,但是静态链接变量 local 到单个编译单元并且是外部不可见。如果在不同的编译单元中声明两个相同名称的静态,它们是完全独立且不相关的变量 - 它们甚至不需要是相同的类型。
请注意,静态链接与静态存储不同,但它们使用相同的关键字。所有全局和静态链接变量都隐式地具有静态存储类,但声明为静态的函数本地变量具有静态存储类 - 即它始终存在 - 如全局,但仅在当地可见。
答案 1 :(得分:0)
Clifford 解释了赋值和初始化之间的区别。但只是为了完整性:您不能在函数之外进行赋值。仅初始化。
但是为什么会出现这个奇怪的错误?这是因为隐式声明。
如果我们谈论的是全球空间,那么这个
int i = 0;
i = 2;
实际上相当于:
int i = 0;
int i = 2;
此代码将打印 42:
#include <stdio.h>
i = 42;
int main(void) {
printf("%d\n", i);
}
原因是向后兼容。不要使用这个“功能”
看似毫不相关的奇怪消息背后的逻辑是这样的:
i=2;
在全局空间中,必须是声明