4

这似乎很微不足道,但对以下行为的有点严格的解释将有助于我理解很多。extern所以我会很感激你的回答。

在下面的示例程序中,我在extern函数x(之后,期望声明链接到它,然后它失败并给出以下错误:main()main()88xmain()printf()extern

test.c||In function 'main':|
test.c|7|error: declaration of 'x' with no linkage follows extern declaration|
test.c|5|note: previous declaration of 'x' was here|
||=== Build finished: 1 errors, 0 warnings ===|


#include<stdio.h>

int main()
{
extern int x;
printf("%d",x);
int x=8;   //This causes error
} 
//int x=8;   //This definition works fine when activated

我在代码中只看到一个错误,该语句int x=8意味着我们x再次声明为具有auto存储类的变量。其余我不明白。你能告诉我以下内容:

1)为什么我们可以在里面extern声明一个变量,没有任何警告或错误?如果有效,它到底是什么意思?

2)既然我们在函数内部声明xextern,它没有显示错误,那么为什么这个声明没有链接到函数内部变量的定义,而是在外部定义变量时?冲突的存储类声明auto-vs-extern是原因吗?

4

4 回答 4

6

extern变量声明是对编译器的一个承诺,即在其他地方会有一个全局变量的定义。局部变量不符合对编译器的承诺,因为它们对链接器不可见。在某种意义上,extern声明类似于函数的前向声明:你对编译器说“我知道这个函数在那里,所以让我现在使用它,让链接器负责定位实际的实现”。

于 2013-05-09T10:23:11.417 回答
1

just remember the concept that when we declare a variable as extern inside a function we can only define it outside of that function.

于 2013-07-30T09:41:50.267 回答
0
Why are we allowed to declare an extern variable inside a function,without any warning or error?If valid,what exactly does it mean?

回答:- 我们可以在功能级别使用 extern,仅在该功能范围内公开它。

Since we declared x as extern inside the function and it showed no error,why then this declaration doesn't link to the definition of the variable inside the function,but looks outside,when the variable is defined outside? Is conflicting storage-class declaration auto-vs-extern the reason for this?

Ans:在块范围内声明的变量(即局部变量)没有链接,除非它们被显式地标为外部。

于 2013-05-09T10:41:21.067 回答
-1

没有人以这种方式使用 extern。extern 通常用于大型项目,大量 .c , .h 文件和一些变量需要共享。在这种情况下,编译通常无法解析变量声明(可能是在一些尚未编译的.h文件上),然后使用“extern”告诉编译器暂时离开它并继续编译,这件事将被处理链接阶段。

于 2013-05-09T10:26:14.420 回答