C语言,全局变量,关于头文件包含的问题

如例,在toto.h里有如下内容:#include<stdio.h>intsum=0;在test1.c包含toto.h#include"toto.h"intmain(){... 如例,在toto.h里有如下内容:
#include<stdio.h>
int sum = 0;
在test1.c包含toto.h
#include"toto.h"
int main()
{
extern sum;
while(1)
{
sleep(1);
printf("%d\n",sum++);
}
reutrn 0;
}

在test2.c也包含toto.h
#include"toto.h"
int main()
{
extern sum;
while(1)
{
sleep(1);
printf("%d\n',sum);
}
return 0;
}

当test1.c和test2.c同时运行时,二者的打印结果不一样呢,求解释
展开
 我来答
金鱼8884
2015-10-03 · 知道合伙人数码行家
金鱼8884
知道合伙人数码行家
采纳数:124 获赞数:14949
学生

向TA提问 私信TA
展开全部
  C语言在头文件中包含全局变量有三种形式:
1 、在头文件中声明一个全局变量,在一个C文件中定义全局变量,然后在所有的引用了这个头文件的C文件里都可以使用该全局变量值。
如在main.c定义
int a = 3;
然后定义一个main.h,那么所有引用main.h的c文件中,均可以访问a并更改其值。

2 、在头文件中定义一个静态全局变量。那么所有引用该头文件的C文件,均拥有一个作用域在本文件范围内的同名静态全局变量。不同文件中的该变量虽然同名,但却是不同的变量。
比如在a.h中定义
static int a = 3;
那么在a.c中引用a.h,并将a值修改为4。
在b.c中也引用a.h,不对a值做修改,打印a值,仍为3, 不会因为a.c中的修改而改变值。

3 、在头文件中定义全局变量。该头文件仅可以被一个C文件引用一次。
比如a.h中定义
int a = 3;
在a.c中可以引用a.h,并对a进行访问和修改。
如果在同项目下有b.c引用了a.h,编译器在链接时会报同名全局变量的错误,导致编译失败。
空雪梦见
2013-05-16 · TA获得超过5596个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1147万
展开全部
因为这所谓的“全局变量”只是在一个进程中全局,并不是在整个系统中全局。
所以你的“同时运行”是启动了两个进程,每个进程都有它自己的int sum
更改一个的值不影响另一个
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
blackangel165
2013-05-16 · TA获得超过237个赞
知道答主
回答量:249
采纳率:0%
帮助的人:117万
展开全部
在test2.c中,sum的值没有变过,一直是0
而test1.c中,sum每打印一次就会++,是0、1、2.....
虽然他们都是使用的头文件toto.h中的全局变量,但test1与test2是两个不同的进程,包含头文件可以理解为把头文件的内容放到test1和test2的开头,这样,相当于只是test1和test2都有一个自己的全局变量sum,两个sum之间是没有关系的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chr1999
2013-05-16 · TA获得超过1056个赞
知道小有建树答主
回答量:2462
采纳率:0%
帮助的人:1223万
展开全部
两个程序直接的变量没有关系.一个程序看不到别的程序定义的东西
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
月下孤城1N
2013-05-16 · 超过12用户采纳过TA的回答
知道答主
回答量:40
采纳率:0%
帮助的人:29.7万
展开全部
extern sum; 亲,这个写法说明是在vc6++上编译的。要是其它是过不去的。

亲,你说的打印不一样,也就在这里了。因为你在别的地方定义了sum这个变量。所以你extern sum;后,这个变量的值是从别的地方拿来用的。

当你两个一起运行,printf("%d\n",sum++);这个语句会把sum的值改了,增加1。当test1.c运行完后,下在面的test2.c中sum的值也会加1;test1.c每运行一次,test2.c调用都不一样

还有你要看一下,你两个文件test1.c与test2.c在编译的时候是不是把他们都纳入进来了。这样他们就会相当于一个文件了。这就是vc6++的好处,也是一个弊端
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式