“外部”的一个函数里?(“extern” inside a function?)

2019-06-27 13:55发布

好了,看完“有点老”一书(“C程序设计语言”,第二版,由丹尼斯里奇),我来到一个交叉执行以下操作:

外部变量必须定义,正好一次,任何函数的外部; 这留出存储它。 变量也必须在要访问它的每个函数声明

我很喜欢- 什么?!

“变量也必须在要访问的每个函数声明”。 然后,我被震惊了一次:

int max; 
/* ... */
int main()
{
    extern int max;
    /* ... */
}

还有一- 什么?!


据我所知(当然,这不是很多,远远不够) extern是有道理的,只有当你的地方定义一个全局变量,你想通过其他文件来访问它(不重新定义它)。

所以:

  • 这是什么点extern int max 内部 main或任何其他功能?
  • 是否真的标准说,这是必须的 (即我需要声明,在这个例子中,这个最大值中的每个功能,将使用它?)
  • 这是同为C ++(这就是为什么我把C ++标签)? 这是我第一次看到这样的事情。

注意:这是不一样的有什么用声明函数内部静态变量为extern的?

Answer 1:

您的文章让我感到惊讶。 我没有那回忆,我已经阅读K&R很久以前。 我只有在这里有第一版,它是有太多。 然而,这还不是全部,它说。 从第一个版本:

变量也必须在要访问的每个函数中声明; 这可以通过一个明确的外部声明或隐含的背景下完成的。

请注意“隐含语境。” 在文后:

...如果它在一个特定的功能使用之前在源文件中出现的变量的外部定义,那么就没有必要在函数外部声明。 在主要的外部声明,......因此多余的。 事实上,通常的做法是把所有的外部变量的定义在源文件的开头,然后忽略所有外部声明。

因此,这是说,使外部变量可以看到里面的函数来完成的只是功能,或可在任何函数外做了在源文件中跟随它的所有功能。 我认为,这是在书的地方是在函数内部完成的唯一场所,后来它使用大家熟悉的一次针对文件的方法。



Answer 2:

extern int max内部main或功能是说编译器“我不是主要的或函数中的局部变量,我在其他地方所定义的全局变量”。

如果全球在同一文件中声明,没有用的。 在不同的文件,是的,但不是每个功能,只需申报一次在使用这个全局变量源的头文件。 这是在相同的c++



Answer 3:

extern联动 。 这意味着这个名字, max ,被链接到一个名字的其他事件,可能在其他文件。 (也就是说,当目标模块连接在一起,使一个可执行文件,所有该名称的链接引用将作出指向同一个对象。)

这个声明的范围是函数体是在剩下的时间。也就是说,在这个文件等功能没有看到这个声明中声明的名称(除非他们宣称它本身)。

范围和联动是不同的东西。



文章来源: “extern” inside a function?