这看起来非常微不足道,但对以下行为的一些严谨解释将有助于我对extern
的理解。所以我将非常感谢您的回答。
在下面的示例程序中,我在函数(extern
)中声明了x
变量main()
。现在,如果我在{{1}之后的文件范围内定义变量并为其分配main()
,然后程序正常运行并打印8
。但如果我在8
之后x
内定义变量main()
,期望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
存储类的变量。我不明白。可以。可以你告诉我以下内容:
1)为什么我们允许在函数内声明auto
变量 而没有任何警告或错误?如果有效,它究竟是什么意思?
2)由于我们在函数内部声明extern
为x
并且它没有显示任何错误,为什么这个声明没有链接到里面变量的定义在外部定义变量时,该函数可以看到外部吗?是否存在冲突的存储类声明extern
?
答案 0 :(得分:6)
extern
变量声明是对编译器的承诺,即某个地方会有全局变量的定义。局部变量不符合对编译器的承诺的履行,因为它们对链接器是不可见的。从某种意义上说,extern
声明类似于函数的前向声明:你对编译器说“我知道这个函数在那里,所以让我现在使用它,让链接器负责定位实际的实现”。
答案 1 :(得分: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?
Ans: - 我们可以在功能级别使用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:在块范围内声明的变量(即局部变量)没有链接,除非它们被明确地decadered为extern。
答案 2 :(得分:0)
请记住这样一个概念:当我们在一个函数中声明一个变量为extern时,我们只能在该函数之外定义它。
答案 3 :(得分:-1)
没有人以这种方式使用extern。 extern通常用于大型项目,大量的.c,.h文件和一些变量需要共享。在这些情况下,编译通常无法解决变量声明(也许,它在某些尚未编译的.h文件中),然后“extern”用于告诉compilar暂时离开它并继续编译,这件事将在连接阶段。