全局变量与局部变量的重新声明

Jee*_*tel 10 c declaration definition one-definition-rule redefinition

当我编译下面的代码时

#include<stdio.h>

int main()
{
  int a;
  int a = 10;
  printf("a is %d \n",a);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

test3.c: In function ‘main’:
test3.c:6:5: error: redeclaration of ‘a’ with no linkage
test3.c:5:5: note: previous declaration of ‘a’ was here
Run Code Online (Sandbox Code Playgroud)

但是,如果我将变量设为全局,那么它可以正常工作.

#include<stdio.h>

int a;
int a = 10;
int main()
{
  printf("a is %d \n",a);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么两次声明相同的全局变量而不是错误,但对局部变量这样做是错误的?

Pra*_*ian 17

在C中,int a;在文件范围内生成的语句是声明和暂定定义.您可以根据需要拥有尽可能多的暂定定义,只要它们彼此匹配即可.

如果定义(使用初始化程序)出现在翻译单元结尾之前,则该变量将初始化为该值.具有多个初始化值是编译器错误.

如果到达翻译单元的末尾,并且未找到非暂定定义,则该变量将初始化为零.

以上不适用于局部变量.这里的声明也可以作为一个定义,并且有多个声明会导致错误.

  • 非常清楚并涵盖所有案例,+ 1 (3认同)