我在使用外部关键字时很困惑C.当它与变量一起使用时,则表示变量的声明。我在main()函数之外声明了变量tmp,并在main中的一个单独的块中定义它,但是当我在后续块中打印该值时,我得到一个错误“UNRESOLVED EXTERNAL LINK”。我很困惑请给我详细解释。
#include <stdio.h>
extern int tmp ;
int main()
{
{
int tmp = 50;
}
{
printf("%d",tmp);
}
return 0;
}
答案 0 :(得分:7)
没有; extern int tmp;
表示“其他地方有变量tmp
的定义”;这是一个声明 - 您可以引用tmp
但它没有定义。此外,当您在函数外部编写extern int tmp;
时,意味着变量将在函数外部定义 - 它是一个全局变量,可以在当前源文件的其他位置或另一个源文件中定义。 (在函数内部编写extern int tmp;
的规则是中等复杂的;现在不要去那里!)
函数中的局部变量int tmp = 50;
与外部声明的全局变量tmp
无关。局部变量隐藏大括号内的全局变量。 (局部变量也未使用。)printf()
语句引用全局变量;局部变量不在printf()
范围内。
因为您没有定义全局变量(例如,通过在文件底部添加int tmp = -2;
),您的程序无法链接并将继续这样做,直到您在此源中定义变量为止文件或链接在另一个定义变量的源文件中。
答案 1 :(得分:3)
这一行:
extern int tmp ;
说在其他地方查找tmp变量定义,这意味着在整个程序中查找其他translation unit中的变量定义。
当你在main中定义int tmp时,它是该函数的本地,即它没有任何external linkage。
免责声明 - 关于此问题的帖子非常多,就像上面评论中提供的链接一样。不,不管我加了多少,它最终会成为一个重复。但是,Jonathan leffler也给你一个很好的答案。
答案 2 :(得分:1)
Extern是重新声明 ,所以它不是crate变量,而只是告诉编译器真正的声明是在其他地方。 您可以在一个源文件中使用它来引用另一个文件中的变量声明,或者在同一个文件中表示您使用以前声明的全局变量。
所以当你声明全局变量
时int a=5;
并在同一源文件中使用函数,可以添加extern int a;在函数体中清楚地告诉它使用全局变量,但声明不在这里。
type func(arguments){
extern int a;
.
.
.
当int a = 5在另一个源文件中时,你放置
extern int a;
在源文件中,您实际上想要使用在先前源文件中声明的全局变量。
答案 3 :(得分:0)
这是关于联系。当你声明一个变量extern
时,你会给它外部链接,说它是用其他地方的全局链接定义的。
在你的函数中,你定义了一个名为tmp的变量,但它没有全局链接,它是一个局部变量。您必须在任何函数之外定义它以使其具有全局链接。
还有静态链接,这意味着变量是全局变量,但仅限于当前编译单元(源文件)。
答案 4 :(得分:0)
使用extern
关键字,您只需声明符号tmp
。这意味着符号在其他地方定义,并在链接时解析
因此,如果您不提供定义符号的编译对象,则链接器会为您提供某种“未解析的符号”错误。