在 a.h中申明全局变量byte gInt;在b.c;d.c;*.c中使用这个全局变量,是否有错?欢迎讨论

xiezhsh 2003-08-13 07:01:21
如:
1. a.h文件:
/******a.h**********/
byte gInt;
.......

2. 所有的.c文件中
#include “a.h”

疑问:
1. 在这种情况下,每一个.c中的gInt变量是否是唯一的?还是每一个.c中都维护自己的
变量gInt?

在线等待中。。。。。。
...全文
69 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiezhsh 2003-08-14
  • 打赏
  • 举报
回复
如果说,在C程序中,申明和定义没什么区别的话,那么:
在a.h中:
byte gInt;
这句代码在编译的时候,在头文件中,就会给分配内存空间(因为是定义). 可实际是这样吗?
我觉得不是, 无论是C还是C++, 分配空间是只能在.c/.cpp 文件中吧。
对否,请大虾裁定。
xiezhsh 2003-08-14
  • 打赏
  • 举报
回复
1. 而且,在a.h的头文件中已经有
#ifndef _A_H_
#define _A_H_
应该可以避免在每一个.c文件中都有一份gInt的拷贝。

2. 中午在VC6.0下按照题中所述的去做,编译根本就没有问题。

这到底是对还是错?哪位高人给个答案。加分没问题。
galaxy_fxstar 2003-08-13
  • 打赏
  • 举报
回复
在c里面声明和定义的概念本来就很很模糊的,对于普通变量来说他们的声明和定义基本上是相同的,不过在定义时可以进行初始化,而在声明时则不可以的。
xiezhsh 2003-08-13
  • 打赏
  • 举报
回复
在C编译器中:
.h中这么写申明还是定义? byte gInt;
xiezhsh 2003-08-13
  • 打赏
  • 举报
回复
搞不明白为什么在a.h中没有加extern,在a.c中对变量进行操作,在b.c中打印,打印的值是a.c中的,而不是b.c中的?
我这个编译器是PSOS系统的C编译器。编译时根本没有出现“重复申明”的错误。
jp311 2003-08-13
  • 打赏
  • 举报
回复
不要在.h里放变量的定义,只放声明
aflyinghorse 2003-08-13
  • 打赏
  • 举报
回复
全局变量会被初始化为适当形式的0(0或0.0)

a.h文件:
byte gInt;
若在两个以上文件中包含a.h,会出现重定义的错误
下面安照fireseed(奶油狗)的方法是正确的,
a.h文件:
extern byte gInt;
a.cpp文件:
byte gInt = 1;



fireseed 2003-08-13
  • 打赏
  • 举报
回复
“在全局域中定义的对象,如果没有指定显式的初始值,则该存储被初始化为0。”
——《C++ Primer》
normalnotebook 2003-08-13
  • 打赏
  • 举报
回复
fireseed(奶油狗) 和 loyyer(我爱C++) 说的是对的,应该用extern byte gInt
loyyer 2003-08-13
  • 打赏
  • 举报
回复
你如果想在其他c文件中用这个全局变量,需要extern byte gInt;初始值是0(你自己试一下,我不确认)
xiezhsh 2003-08-13
  • 打赏
  • 举报
回复
全局变量gInt在各个.c中的初始值是多少?是肯定为0还是随机?
xiezhsh 2003-08-13
  • 打赏
  • 举报
回复
你的意思:
gInt在不同的C文件中的值是不一样的?脱离了想作为全局变量的原意?那么我的程序为什么打印出的数据显示都是一样的?难道是一种巧合?
而且,在b.c中对gInt进行了很多操作,在c.c中没有任何操作,那么按照你的说法就是在c.c中打印的数据不应该是b.c中的数据,可实际的情况却是,这是什么原因?
fireseed 2003-08-13
  • 打赏
  • 举报
回复

设想有下面的情况:
你想定义一个全局变量,以供在不同文件中声名的类进行访问,并且这个全局变量是一个大型类库的一部分,也就是说用户可能重载你的类,并企图在他们重载的类中也访问你的这个全局变量。所以你在一个BaseDef.h的头文件中写下了如下定义:
int MonitorNum 1;

但在你编译你的类库的时候你却发现,每一个引用到这个头文件,并使用了这个全局变量的类所在的obj里都出现了一个MonitorNum变量的副本,但这结果并不是你想要的,因为每一个副本意味着不同的变量,当你更改某一个MonitorNum变量副本的值时,其它的MonitorNum变量副本的值是不会发生改变的。

C++为您提出了更好的解决方案:extern。现在你只需要在BaseDef.h中这样声明:
extern int MonitorNum;
而在BaseDef.cpp里这样定义:
int MonitorNum = 1;
C++的编译器会自动将MonitorNum视为外部引用,而在所有的OBJ里只生成一份MonitorNum。
fireseed 2003-08-13
  • 打赏
  • 举报
回复
每一个.c都会对映有一个OBJ,而编译时.h是会被做为.c上面的一部分进行编译的。

所以每一个OBJ都会有在.h中声明的变量

建议使用extern关键字

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧