繁体   English   中英

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

[英]Why Global variable redefinition is not allowed?

#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'|错误: /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("%d\n", i);
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM