社区
C语言
帖子详情
在 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
打赏
收藏
在 a.h中申明全局变量byte gInt;在b.c;d.c;*.c中使用这个全局变量,是否有错?欢迎讨论
如: 1. a.h文件: /******a.h**********/ byte gInt; ....... 2. 所有的.c文件中 #include “a.h” 疑问: 1. 在这种情况下,每一个.c中的gInt变量是否是唯一的?还是每一个.c中都维护自己的 变量gInt? 在线等待中。。。。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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关键字
mma7660.c的改进
/*当水平放置时,传感器的某个轴重力达到最大时,另外两个轴读数应该为0,但是硬件缺陷使得另两轴会跳值,实验结果,其跳值范围在,1~2,且连续跳值次数极少超过2次。...其
中
predata,prepredata是
全局变量
...
硬件 TCP/IP 协议栈(SPI发送命令字)
以太网接口芯片CH395Q 寄存器配置与
使用
移植CH395Q 源码 TCP_Client 实验 TCPClient 配置流程 TCPClient 实验 硬件设计 程序设计 下载验证 WebServer 实验 WebServer 简介 WebServer 实验 硬件设计 软件设计 下载...
Python3
中
compile_command/compile编译可执行语句(或文件)、parser剖析器创建可执行代码、exec/eval动态执行语句的深入分析
Python提供了在代码
中
动态执行代码的功能。一.exec/eval动态执行语句exec、eval动态执行语句。exec主要用在计算方面(无返回结果),eval主要用在比较方面(返回结果)。(特别注意:如果是将exec或者eval定义在对象内部...
gstreamer初始化和plu
gin
registry过程
gstreamer在开始的时候,都会调用gst_init初始化gstreamer,gst_init可以处理main函数的argc和argv变量,解析处理自己的option,加载plu
gin
,注册插件等,完成初始化相关工作。 gst_init函数很简单,调用gst_init_...
DBUS基础知识(非常全面)
1.底层接口层:主要是通过libdbus这个函数库,给予系统
使用
DBus的能力。 2.总线层:主 要Message bus daemon这个总线守护进程提供的,在Linux系统启动时运行,负责进程间的消息路由和传递,其
中
包括Linux内核和Linux...
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章