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;在文件范围内生成的语句是声明和暂定定义.您可以根据需要拥有尽可能多的暂定定义,只要它们彼此匹配即可.
如果定义(使用初始化程序)出现在翻译单元结尾之前,则该变量将初始化为该值.具有多个初始化值是编译器错误.
如果到达翻译单元的末尾,并且未找到非暂定定义,则该变量将初始化为零.
以上不适用于局部变量.这里的声明也可以作为一个定义,并且有多个声明会导致错误.