我知道这是一个基本问题,不确定c标准是否允许它。我在面试中获得了代码片段,并被要求提供输出。
我已经在函数内声明了一个extern和一个局部变量,它会抛出一个重新声明错误(就像全局一样)可能是什么原因?既然我是在同一个街区宣布的,那么extern应该能够找到它吗?
#include <stdio.h>
int main(void){
int i = 10;
extern int i ;
printf("%d \n",i);
}
Error : 1.c: In function ‘main’:
1.c:13: error: extern declaration of ‘i’ follows declaration with no linkage
1.c:12: note: previous definition of ‘i’ was here
答案 0 :(得分:3)
int i = 10;
extern int i ;
第一个,因为它是函数范围,意味着&#34;声明并定义一个变量i
,它是函数&#34;的本地变量。变量不具有链接,因为它是函数本地的;具体而言(C11 6.2.2第6段):
以下标识符没有链接:[...];没有存储类说明符extern声明的对象的块作用域标识符。
另一方面,第二个声明说&#34;声明一个变量i
,它有外部链接&#34;。
在某些限制内,允许重新声明变量,但通常声明必须一致;上述两个陈述相互矛盾。此外,无法重新声明没有链接的标识符 - 来自C11 6.7第3段:
如果标识符没有链接,则不得超过一个 声明标识符(在声明符或类型说明符中)的声明 相同的范围和相同的名称空间
(之后会列出一些例外情况,但这里不相关)。
如果语句在外函数(在文件范围级别),那么int i = 10;
声明将指示外部链接,因此以下声明是一致的 - 事实上,它没有&# 39; t甚至需要保持一致,因为6.2.2第4段适用:
对于在该标识符的先前声明可见的范围内使用存储类说明符
extern
声明的标识符, 31)如果先前声明指定内部或外部链接,后一声明中的标识符的链接与先前声明中指定的链接相同。如果没有先前的声明可见,或者如果先前声明 声明指定没有链接,那么标识符有外部链接。
(因此,在文件范围内声明static int i = 0; extern int i;
是完全合法的 - 即使声明不一致,第二个也是上述规则所允许的,尽管我不知道这个的基本原理。但是,你不能以相反的顺序拥有这些陈述。)
答案 1 :(得分:2)
你不能在同一个块中声明两个具有相同名称的变量,这就是你正在尝试的。而且编译器正在告诉你。可能是错误的原因是什么? C语言说是不允许的,编译器实现了C语言。
编译器发现块中的第一个“i”就好了,这就是它抱怨的原因。
如果这被接受并且您在块中使用了i,您会期待什么?编译器如何知道你指的是哪两个?