代码之家  ›  专栏  ›  技术社区  ›  user3721704

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

  •  1
  • user3721704  · 技术社区  · 10 年前
    #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 回复  |  直到 10 年前
        1
  •  3
  •   Clifford    10 年前

    这不是 重新定义 它是 分配 .

    分配与 初始化 在C语言中,并且不能在函数外部完成-在该上下文中没有执行线程,那么什么时候可以完成?

    变量 static 链接与全局变量(与 extern 链接),但静态链接变量是 地方的 到单个编译单元,并且在外部不可见。如果在单独的编译单元中声明两个同名的静态变量,那么它们是完全独立且不相关的变量——它们甚至不需要是相同的类型。

    请注意 静态连杆 不同于 静态存储器 ,但它们使用相同的关键字。所有全局和静态链接变量都隐式地具有静态存储类,但 函数局部 声明为静态的变量具有 静态存储类 -即它始终存在-就像一个全局,但仅在本地可见。

        2
  •  0
  •   klutt Anjali Shah    3 年前

    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; 在全球空间中,必须是声明