关于C#:使用’extern’关键字


Use of 'extern' Keyword

本问题已经有最佳答案,请猛点这里访问。

我对在C中使用extern关键字感到困惑。当它与变量一起使用时,则表示变量的声明。我在main()函数之外声明变量tmp,并在main的单独块中定义它,但是当我在随后的块中打印值时,我得到一个错误"unresolved external link"。我很困惑,请给我详细解释。

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
extern int tmp ;
int main()
{
    {
        int tmp = 50;
    }
    {
        printf("%d",tmp);
    }
    return 0;
}


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

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

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


这条线:

1
 extern int tmp ;

表示在其他地方查找tmp变量定义,这意味着在整个程序的其他翻译单元中查找变量定义。

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

免责声明-有很多关于这方面的文章,如上面评论中提供的链接。不,不管我加了多少,最终都会变成重复。不过,下面的乔纳森·莱弗勒也给出了一个很好的答案。


外部正在重新声明,所以它不装箱变量,但只告诉编译器真正的声明在其他地方。您可以在一个源文件中使用它来引用另一个文件中的变量声明,或者在同一个文件中使用它来表示以前声明的全局变量。

所以当你声明全局变量

1
int a=5;

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

1
2
3
4
5
type func(arguments){
extern int a;
.
.
.

当int a=5在另一个源文件中时,

1
 extern int a;

在源文件中,您实际上希望使用在上一个源文件中声明的全局变量A。


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

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


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

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

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