【问题标题】:Why Global variable redefinition is not allowed?为什么不允许全局变量重新定义?
【发布时间】:2014-07-11 16:37:57
【问题描述】:
#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. 全局变量存储在数据段(内存区域)中,与存储静态变量的位置相同。静态变量怎么会被重新声明?

【问题讨论】:

  • 错误在哪一行?您现在向我们展示的代码不应产生错误。
  • i=2;不是函数外的有效语句。错误消息是错误的 - 但它告诉您某些事情是不正确的。为什么要重新声明一个静态变量?

标签: c memory global-variables redefinition


【解决方案1】:

这不是重新定义,而是赋值

赋值与 C 中的 初始化 不同,不能在函数之外完成 - 在该上下文中没有执行线程,那么什么时候完成?

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多