C语言 为什么不允许全局变量重定义


#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. 全局变量存储在数据段(内存区域),与静态变量存储在同一位置。为什么静态变量可以被重新声明?

这不是重定义,而是赋值

赋值与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);
}

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

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

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

相关内容

  • 没有找到相关文章

最新更新