为什么不允许全局变量重定义?

时间:2014-07-11 16:37:58

标签: c memory global-variables redefinition

#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'|

  1. 为什么C中不允许重新定义变量。
  2. 全局变量存储在数据段(内存区域)中,存储静态变量的位置。静态变量怎么可以重新声明?

2 个答案:

答案 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);
}

原因是向后兼容。不要使用这个“功能”

看似毫不相关的奇怪消息背后的逻辑是这样的:

  1. 允许隐式声明
  2. 全局空间中不允许赋值
  3. 因此,i=2; 在全局空间中,必须是声明