一个功能内的"extern"?

Kir*_*rov 21 c c++ global-variables kernighan-and-ritchie extern

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

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

我就像 - 什么?!

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

int max; 
/* ... */
int main()
{
    extern int max;
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

还有一个 - 什么?!


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

所以:

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

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

Avi*_*ger 14

你的帖子让我很惊讶.我没有回忆那些,很久以前我读过K&R.我这里只有第一版,它也在那里.但是,这并不是全部.从第一版开始:

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

请注意"隐式按上下文".后面的文字:

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

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


Sco*_*Zhu 9

extern int max内部main或函数对编译器说"我不是main或函数中的局部变量,我是其他地方定义的全局变量".

如果全局声明在同一个文件中,则无用.在不同的文件中,是的,但不是在每个函数中,只需在使用此全局变量的源的头文件中声明一次.这是相同的c++.