外部功能

时间:2016-11-02 11:29:09

标签: c

我知道这是一个基本问题,不确定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

2 个答案:

答案 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,您会期待什么?编译器如何知道你指的是哪两个?