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同时运行时,二者的打印结果不一样呢,求解释 展开
#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同时运行时,二者的打印结果不一样呢,求解释 展开
6个回答
展开全部
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,编译器在链接时会报同名全局变量的错误,导致编译失败。
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,编译器在链接时会报同名全局变量的错误,导致编译失败。
展开全部
因为这所谓的“全局变量”只是在一个进程中全局,并不是在整个系统中全局。
所以你的“同时运行”是启动了两个进程,每个进程都有它自己的int sum
更改一个的值不影响另一个
所以你的“同时运行”是启动了两个进程,每个进程都有它自己的int sum
更改一个的值不影响另一个
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在test2.c中,sum的值没有变过,一直是0
而test1.c中,sum每打印一次就会++,是0、1、2.....
虽然他们都是使用的头文件toto.h中的全局变量,但test1与test2是两个不同的进程,包含头文件可以理解为把头文件的内容放到test1和test2的开头,这样,相当于只是test1和test2都有一个自己的全局变量sum,两个sum之间是没有关系的
而test1.c中,sum每打印一次就会++,是0、1、2.....
虽然他们都是使用的头文件toto.h中的全局变量,但test1与test2是两个不同的进程,包含头文件可以理解为把头文件的内容放到test1和test2的开头,这样,相当于只是test1和test2都有一个自己的全局变量sum,两个sum之间是没有关系的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
两个程序直接的变量没有关系.一个程序看不到别的程序定义的东西
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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++的好处,也是一个弊端
亲,你说的打印不一样,也就在这里了。因为你在别的地方定义了sum这个变量。所以你extern sum;后,这个变量的值是从别的地方拿来用的。
当你两个一起运行,printf("%d\n",sum++);这个语句会把sum的值改了,增加1。当test1.c运行完后,下在面的test2.c中sum的值也会加1;test1.c每运行一次,test2.c调用都不一样
还有你要看一下,你两个文件test1.c与test2.c在编译的时候是不是把他们都纳入进来了。这样他们就会相当于一个文件了。这就是vc6++的好处,也是一个弊端
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询