4

我对在 C 中使用 extern 关键字感到困惑。当它与变量一起使用时,它意味着变量的声明。我在 main() 函数之外声明变量 tmp 并将其定义在 main 中的单独块中,但是当我在后续块中打印该值时,出现错误“未解决的外部链接”。我很困惑,请给我详细的解释。


#include <stdio.h>
extern int tmp ;
int main()
{
    {
        int tmp = 50;
    }
    {
        printf("%d",tmp);
    }
    return 0;
}

4

5 回答 5

7

不; extern int tmp;意思是“在其他地方有一个变量的定义tmp”;这是一个声明——你可以引用tmp但它没有被定义。此外,当您extern int tmp;在函数外部编写时,这意味着该变量将在函数外部定义——它是一个全局变量,可以在当前源文件的其他地方或另一个源文件中定义。(extern int tmp;写在函数内部的规则比较复杂;我们现在不要去那里!)

您在函数中的局部变量与外部声明int tmp = 50;的全局变量无关。tmp局部变量将全局变量隐藏在大括号内。(局部变量也未使用。)printf()但是,该语句引用了全局变量;局部变量不在printf().

因为您没有定义全局变量(例如,通过int tmp = -2;在文件底部添加),所以您的程序无法链接并将继续这样做,直到您在此源文件中定义变量或在另一个源文件中链接变量已定义。

于 2013-09-05T07:31:17.040 回答
3

这一行:

 extern int tmp ;

说在其他地方寻找tmp变量定义,意思是在整个程序的其他翻译单元中寻找变量定义。

当您在 main 中定义 int tmp 时,它是该函数的本地函数,即它没有任何外部链接

免责声明- 在 SO 上有很多关于此的帖子,例如上面评论中提供的链接。不,无论我添加多少,最终都会成为重复。但是,Jonathan leffler 在下面也有一个很好的答案。

于 2013-09-05T07:28:16.493 回答
1

Extern 是 redeclaration ,因此它不会创建变量,而只会告诉编译器真正的声明在其他地方。您可以在一个源文件中使用它来引用另一个文件中的变量声明,或者在同一个文件中表示您使用先前声明的全局变量。

所以当你声明全局变量时

int a=5;

和在同一个源文件中使用in函数,可以添加extern int a;在函数体中清楚地表明它使用全局变量但声明不在此处。

type func(arguments){
extern int a;
.
.
.

当 int a=5 在您放置的另一个源文件中时

 extern int a; 

在源文件中,您实际上想要使用在先前源文件中声明的全局变量 a。

于 2013-09-05T07:29:44.953 回答
0

这是关于联动。当你声明一个变量时extern,你给它外部链接,说它是用其他地方的全局链接定义的。

在您的函数中,您定义了一个名为 tmp 的变量,但它没有全局链接,它是一个局部变量。您必须在任何函数之外定义它以提供全局链接。

还有静态链接,这意味着变量是全局的,但仅限于当前编译单元(源文件)。

于 2013-09-05T07:30:19.290 回答
0

使用extern关键字您只声明符号tmp。这意味着符号是在其他地方定义的,并将在链接时解析。
因此,如果您不提供定义符号的编译对象,链接器会给您某种“未解析的符号”错误。

有关C 中的声明或定义的更多详细信息,请参阅以下问题

于 2013-09-05T07:30:35.483 回答