嗯,读了“一本有点老”的书(“C编程语言”,第二版,丹尼斯·里奇写的),我遇到了以下问题:
外部变量必须在任何函数之外定义一次;这会为它预留存储空间。该变量还必须在每个要访问它的函数中声明
我就想-什么?!
“变量也必须在每个想要访问它的函数中声明”。然后,我又一次震惊了:
int max;
/* ... */
int main()
{
extern int max;
/* ... */
}再来一次-什么?!
据我所知(显然,这远远不够),只有当你在某个地方定义了一个全局变量,并且你想要通过另一个文件访问它(而不是再次定义它)时,extern才有意义。
所以:
main或任何其他函数中这个extern int max的意义是什么?注意:这与What is the use of declaring a static variable as extern inside a function?不同
发布于 2012-08-30 23:43:38
你的帖子让我很惊讶。我不记得了,我很久以前就读过K&R了。我这里只有第一版,它也在那里。然而,这并不是它所说的全部。从第一版开始:
变量还必须在想要访问它的每个函数中声明;这可以通过显式外部声明或通过上下文隐式声明来完成。
注意“隐式地通过上下文”。在正文的后面:
...if在特定函数中使用变量之前,变量的外部定义出现在源文件中,这样就不需要在函数中进行外部声明。main中的外部声明,...因此是多余的。实际上,常见的做法是将所有外部变量的定义放在源文件的开头,然后省略所有外部声明。
所以这就是说,使外部变量可见可以在函数内部完成,只针对该函数,或者可以在任何函数外部完成,对于源文件中跟随它的所有函数。我相信这是书中唯一在函数内部完成的地方,后来它使用了熟悉的一次文件方法。
发布于 2012-08-30 23:18:33
main或function中的extern int max告诉编译器“我不是main或function中的局部变量,我是在别处定义的全局变量”。
如果全局变量是在同一文件中声明的,则不起作用。在不同的文件中,是的,但不是在每个函数中,只需在使用此全局变量的源文件的头文件中声明一次。这在c++中是一样的。
发布于 2012-08-30 23:06:42
extern是链接的。这意味着此名称max链接到该名称的其他匹配项,可能在其他文件中。(也就是说,当对象模块链接在一起以生成可执行文件时,对此名称的所有链接引用都将引用同一对象。)
此声明的作用域是它所在的函数体的其余部分。这意味着此文件中的其他函数看不到此声明声明的名称(除非它们自己声明)。
作用域和链接是不同的东西。
https://stackoverflow.com/questions/12199656
复制相似问题