标题:关于C中extern的问题
只看楼主
行书万里
Rank: 2
等 级:论坛游民
帖 子:11
专家分:40
注 册:2012-7-12
结帖率:40%
已结贴  问题点数:20 回复次数:5 
关于C中extern的问题
#include<stdio.h>
extern int temp;//extern int temp=0;
int main(void)
{
   temp=1;
   printf("%d\n",temp);
return 0;
}
为什么C编译时,temp没有初始化会编译出错:unresolved external symbol "int temp";
搜索更多相关主题的帖子: void return 
2013-05-06 23:09
行书万里
Rank: 2
等 级:论坛游民
帖 子:11
专家分:40
注 册:2012-7-12
得分:0 
我看了些资料,理解对不对?
extern int temp;只是说明temp是一个外部变量,此时并没有定义它,而实际上外部也没有定义,所以编译时提示出错。
extern int temp=0;说明temp是一个外部变量,同时定义了temp为int并初始化,(声明不能初始化)。所以此时编译正确。
2013-05-06 23:45
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
得分:7 
extern int temp;   表示声明一个全局变量
引用时还需要定义   int temp

三十年河东,三十年河西,莫欺少年穷!
2013-05-06 23:53
Juson
Rank: 4
等 级:业余侠客
帖 子:70
专家分:235
注 册:2013-4-8
得分:7 
extern int temp;      只是是声明外部变量temp,不分配内存,这时在外部必须要定义temp,否则就是未定义
extern int temp=0;    这里就变成定义了,分配内存,这时如果外部也定义了temp,结果就是重定义
所以你代码里temp就是未定义的
2013-05-07 00:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:7 
extern只是一个声明,声明你现在这个模块将要使用一个名称是什么什么的东西,而这个东西的定义不在本模块中,之所以要在本模块中存在这样的声明,就是告诉编译器遇到这种东西应该到别的模块中搜寻定义。你看的资料基本正确,但extern int temp = 0这样是多余的,int temp = 0已经是定义,不需要再extern,相反,在别的模块文件中extern int temp才会使用此处的temp,自己是不需要extern int temp的,而如果你在别的模块又来一次extern int temp = 0,就会出现重复定义错误。

事实上,.h头文件中就大量存在extern声明,.h主要就是做这种事,它本身没什么用,只有C/C++还保留.h,现在很多类C语法都舍弃.h文件了,Java/C#都没有。

授人以渔,不授人以鱼。
2013-05-07 09:11
行书万里
Rank: 2
等 级:论坛游民
帖 子:11
专家分:40
注 册:2012-7-12
得分:0 
谢谢大家的解答。我明白了extern的作用了。
2013-05-07 22:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-406375-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050247 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved