23

好吧,阅读“有点老”的书(Dennis Ritchie 的“The C programming language”,第二版),我遇到了以下问题:

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

我当时想 -什么?!

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

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

还有一个——什么?!


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

所以:

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

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

4

4 回答 4

14

你的帖子让我吃惊。我不记得了,我很久以前就读过 K&R。我这里只有第一版,它也在那里。然而,这并不是它所说的全部。从第一版开始:

该变量还必须在每个想要访问它的函数中声明;这可以通过显式的外部声明或通过上下文隐式完成。

注意“隐含的上下文”。正文后面:

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

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

于 2012-08-30T15:43:37.877 回答
11

extern int maxinside mainor function 对编译器说“我不是 main 或函数内部的局部变量,我是在别处定义的全局变量”

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

于 2012-08-30T15:18:32.880 回答
2

extern联动。_ 这意味着此名称 ,max链接到该名称的其他出现,可能在其他文件中。(也就是说,当对象模块链接在一起以生成可执行文件时,所有对该名称的链接引用都将指向同一个对象。)

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

范围和链接是不同的东西。

于 2012-08-30T15:06:42.437 回答
0

函数内部的另一个可能原因extern是确保没有局部变量隐藏全局变量

没有extern

int max = 33;
int main()
{
    int max; 
    printf("%d", max); // prints indeterminate value (garbage)
}

extern

int main()
{
    extern int max; 
    int max;
    printf("%d", max);
}

输出:

错误:重新声明没有链接的“max”

于 2022-02-15T11:36:49.627 回答