社区
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?
在线等待中。。。。。。
...全文
78
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
作业
写回复
配置赞助广告
用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关键字
【安卓逆向】frida api文档JavaScript API
中
文翻译 双语对照 带csdn目录
JavaScript 代码可以
使用
名为 cm 的
全局变量
来访问 CModule 对象,但只有在调用 rpc.exports.init() 之后,因此请根据那里的 CModule 执行任何初始化。虽然 send() 是异步的,但发送单条消息的总开销并未针对高频进行优化,因此这意味着 Frida 将多个值批处理到单个 send() 调用
中
,具体取决于是需要低延迟还是高吞吐量。提供的回调对性能有重大影响。但是,在挂钩热函数时,可以将 Interceptor 与 CModule 结合
使用
,以实现 C
中
的回调。
mma7660.c的改进
/*当水平放置时,传感器的某个轴重力达到最大时,另外两个轴读数应该为0,但是硬件缺陷使得另两轴会跳值,实验结果,其跳值范围在,1~2,且连续跳值次数极少超过2次。故在report_abs()
中
加入过滤语句,过滤重力传感器的“自跳”,其逻辑是:在某个轴上,若此次读数小于等于2,且前两次读数至少有一次为0,就认为此读数为自跳,将其置零。其
中
predata,prepredata是
全局变量
...
[单片机][IIC/I2C][APDS9960] 手势传感器 4种手势
使用
例子: IIC协议链接完整工程:https://cloud.189.cn/t/mYrm2uiQjQFj
如何
使用
GDAL进行图像镶嵌
相信看过和用过gdalwarp工具的同学都会对gdalwarp这个工具的强悍功能所震惊。今天主要就是用gdalwarp来进行图像镶嵌,当然这个镶嵌是比较简单的镶嵌,就是上层的图像会覆盖下层的图像。对于gdalwarp的介绍,我还要搬过来一下,见下面: The gdalwarp utility is an imagemosaicing, reproject...
gstlibav的初始化过程
gstlibav的初始化过程 gst-libav的文件目录结构 gstlibav的核心代码在gst-libav/ext/libav目录下,把plu
gin
对应的c文件列出来有以下这么多: gst-libav/ext/libav ├── gstavauddec.c ├── gstavaudenc.c ├── gstav.c ├── gstavdemux.c ├── gstavmux.c ├── gstavprotocol.c ├── gstavutils.c ├── gstavviddec.c ├── gsta
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章