一个function内的“extern”?

那么,阅读“有点旧”的书(“C编程语言”,第二版,丹尼斯·里奇),我得到了以下几点:

外部变量必须在任何函数之外定义一次; 这为它留出了存储空间。 还必须在每个想要访问它的函数中声明变量

我就像 – 什么?!

“还必须在每个想要访问它的函数中声明变量”。 然后,我又一次感到震惊:

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

还有一个 – 什么?!


据我所知(显然,它并不多,而且远远不够), extern只有在某个地方定义一个全局变量并且你想通过另一个文件访问它时才有意义(不是再次定义它)。

所以:

  • main或任何其他function中,这个extern int max什么意义?
  • 该标准是否真的说,这是必须的 (我需要声明,对于这个例子,每个函数中的最大值 ,它将使用它吗?)
  • C ++是否相同(这就是我放置C ++标签的原因)? 这是我第一次看到这样的东西。

注意:这与在函数内声明静态变量作为extern的用法有什么不同?

你的post让我很惊讶。 我没有回忆这一点,很久以前我就读过K&R。 我这里只有第一版,它也在那里。 然而,这并不是全部说的。 从第一版开始:

还必须在每个想要访问它的函数中声明变量; 这可以通过显式的extern声明或隐式的context来完成。

请注意“隐式按上下文”。 后面的文字:

…如果变量的外部定义在特定函数中使用之前发生在源文件中,则函数中不需要extern声明。 因此,主要的外部声明……是多余的。 实际上,通常的做法是将所有外部变量的定义放在源文件的开头,然后省略所有extern声明。

所以这就是说,使extern变量可见只能在函数内部完成,或者可以在源文件中跟随它的所有函数的任何函数之外完成。 我相信这是本书中唯一在函数内部完成的地方,后来它使用熟悉的文件方法。

  • “extern int max”。 里面的main或函数就像对编译器说嘿,我不是main或函数里面的局部变量,我是刚才定义的全局变量。

    • 在同一个文件中,没有。 在不同的文件中,是的,但不是在每个函数中,只需在使用此全局变量的源的头文件中声明一次

    • 在c ++中也是如此

我的英语不好,希望你能理解我,随意问我更多问题。

extern联系 。 这意味着此名称max与名称的其他匹配项相关联,可能在其他文件中。 (也就是说,当对象模块链接在一起以生成可执行文件时,将对此名称的所有链接引用引用同一对象。)

此声明的范围是它所在的函数体的其余部分。这意味着此文件中的其他函数看不到此声明声明的名称(除非它们自己声明)。

范围和联系是不同的事情。