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;
} |
- 这应该有帮助:C中的外部变量是什么?
- 当我指出stackoverflow.com/questions/1433204/&hellip;时,我的意思是把它当作有用的背景阅读。我认为它不能充分回答这个特定的问题,这就是为什么我不同意把前面的问题看成是一个副本。
不;extern int tmp;的意思是"在其他地方有一个变量tmp的定义";这是一个声明-你可以引用tmp但没有定义。此外,当您在函数外部编写extern int tmp;时,这意味着变量将在函数外部定义—它是一个全局变量,可以在当前源文件或其他源文件的其他位置定义。(在函数内部编写的EDOCX1[3]的规则相当复杂;现在我们不要去那里!)
函数中的局部变量int tmp = 50;与外部声明的全局变量tmp无关。局部变量将全局变量隐藏在大括号内。(局部变量也未使用)printf()语句引用了全局变量;局部变量不在printf()的范围内。
因为您没有定义全局变量(例如,通过在文件底部添加int tmp = -2;),所以您的程序无法链接,并将继续执行此操作,直到您在此源文件中定义该变量或在另一个定义该变量的源文件中链接。
- NP。一个很好的详细答案:)。我有点不同意,即不能在同一源文件中的其他位置定义具有外部变量的全局变量。它将在同一个翻译单元中,但不在同一个源文件中。如果你不相信,请告诉我。
- 你的意思是你认为你不能这样做:extern int i; int i = 97;作为源文件中的连续行,在函数范围之外?试试看-你可以…按任何顺序。一个是声明,另一个是定义,它们可以共存。您可以重复声明,但不能重复定义。
- 六羟甲基三聚氰胺六甲醚。。。这很有趣。我很肯定我至少在我的职业生涯中失败过一次。可能是桌面操作系统的标准编译器,如GCC所允许的,正如您所提到的,我的场景可能是嵌入式的,如ARM或PPC或MIP的GCC,因为我已经与它们合作了很多。但我会确保这是推荐作为一个便携式标准实践。谢谢你指出这一点
- 看看C问题中的extern变量是什么,得到一个非常(非常,非常)长的答案。但是,最好有一个声明全局变量的头,并将该头包含在定义全局变量的源文件中,以确保声明和定义一致。其他引用全局变量的文件可以自信地使用声明。这种交叉检查是至关重要的,并且需要extern int global_var;和int global_var = 12345;共存。
这条线:
表示在其他地方查找tmp变量定义,这意味着在整个程序的其他翻译单元中查找变量定义。
当您在main中定义in t tmp时,它是该函数的本地函数,即它没有任何外部链接。
免责声明-有很多关于这方面的文章,如上面评论中提供的链接。不,不管我加了多少,最终都会变成重复。不过,下面的乔纳森·莱弗勒也给出了一个很好的答案。
- "其他地方"可以在文件范围之外更详细地描述为一个不同的"翻译单元"。+1虽然是第一个正确的答案
- @法耶亚兹克是的,添加一些细节,请稍候!谢谢!顺便说一句:
外部正在重新声明,所以它不装箱变量,但只告诉编译器真正的声明在其他地方。您可以在一个源文件中使用它来引用另一个文件中的变量声明,或者在同一个文件中使用它来表示以前声明的全局变量。
所以当你声明全局变量
在同一个源文件中的函数中使用,可以在函数体中添加extern int a;以清楚地表明它使用全局变量,但声明不在这里。
1 2 3 4 5
| type func(arguments){
extern int a;
.
.
. |
当int a=5在另一个源文件中时,
在源文件中,您实际上希望使用在上一个源文件中声明的全局变量A。
使用extern关键字只声明符号tmp。这意味着符号是在其他地方定义的,将在链接时解析。
因此,如果您不提供定义符号的已编译对象,那么链接器会向您提供某种"未解析符号"错误。
有关C中声明或定义的更多详细信息,请参见以下问题
这是关于联动装置的。当你声明一个变量extern时,你给它提供了外部链接,说它是用其他地方的全局链接定义的。
在您的函数中,您定义了一个名为tmp的变量,但它没有全局链接,而是一个局部变量。您必须在任何函数之外定义它,以提供全局链接。
还有静态链接,这意味着变量是全局的,但仅限于当前编译单元(源文件)。