好吧,阅读“有点老”的书(“C编程语言”,第二版,丹尼斯·里奇饰演),我来了一个十字架:
外部变量必须在任何函数之外定义一次;这为它预留了存储空间。该变量也必须在每个想要访问它的函数中声明
我就像 - 什么?!
“还必须在每个想要访问它的函数中声明变量”。然后,我又一次感到震惊:
int max;
/* ... */
int main()
{
extern int max;
/* ... */
}
还有一个 - 是什么?!
据我所知(显然,它并不多,而且远远不够),extern
只有在某个地方定义一个全局变量而你想通过另一个文件访问它时才有意义(不再定义它) )。
所以:
extern int max
里面的main
{{1}}或其他任何功能有什么意义?注意:这与What is the use of declaring a static variable as extern inside a function?
不同答案 0 :(得分:14)
你的帖子让我感到惊讶。我对此没有回忆,很久以前我就读过K& R.我这里只有第一版,它也在那里。但是,这并不是全部。从第一版开始:
还必须在每个想要的函数中声明变量 访问它;这可以通过明确的外部声明来完成 或隐含地通过上下文。
请注意“隐含地按上下文”。后面的文字:
...如果源文件中出现变量的外部定义 在它用于特定功能之前,则不需要 函数中的extern声明。主要的外部声明, ......因此是多余的。事实上,通常的做法是放置 源头开头的所有外部变量的定义 文件,然后省略所有extern声明。
所以这就是说,使extern变量可见只能在函数内部完成,或者可以在源文件中跟随它的所有函数的任何函数之外完成。我相信这是本书中唯一在函数内部完成的地方,后来它使用熟悉的文件方法。
答案 1 :(得分:8)
extern int max
内部的{p> main
或函数对编译器说“我不是main或函数中的局部变量,我是其他地方定义的全局变量”。
如果全局声明在同一个文件中,则无用。在不同的文件中,是的,但不是在每个函数中,只需在使用此全局变量的源的头文件中声明一次。 c++
中也是如此。
答案 2 :(得分:2)
extern
是链接。这意味着此名称max
链接到其他名称,可能在其他文件中。 (也就是说,当对象模块链接在一起以生成可执行文件时,所有对此名称的链接引用都将引用同一对象。)
此声明的范围是它所在的函数体的其余部分。这意味着此文件中的其他函数看不到此声明声明的名称(除非它们自己声明)。
范围和联系是不同的事情。