社区
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?
在线等待中。。。。。。
...全文
99
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关键字
RL78/D1A微控制器安全功能实战:CRC、RAM奇偶校验与内存保护详解
本文深入解析RL78/D1A微控制器的四大硬件级安全机制:通用CRC-16-CCITT校验(支持LSB-first比特反转)、RAM奇偶校验(自动触发复位)、RAM/SFR内存保护(写操作静默忽略)及非法内存访问检测(配合IAWCTL寄存器配置)。同时涵盖频率检测、A/D自检等IEC 60730合规功能,以及关键寄存器(CRCIN/CRCD、RPECTL、IAWCTL)配置流程、选项字节安全设置(WDTON/LVD/CLKMB)和调试实践要点。
glib linux,[转载]linux下glib.h的介绍
Glib是Linux平台下广泛
使用
的C语言库,它是Gtk+和Gnome的基础。Glib提供跨平台支持,包括整数、布尔、字符和浮点类型定义,以及宏如TRUE/FALSE、MIN/MAX等。此外,Glib包含宏用于指针转换、错误处理、调试和数据结构如双向链表。GString是Glib
中
用于处理字符串的类,支持各种操作如拼接、截断。GTimer则提供计时功能。Glib还包含错误处理函数,如g_strerror(),以及用于内存管理和字符串操作的实用工具。
glib的头文件glib.h介绍
本文介绍了GLib库的基本概念,包括其在Linux平台的重要性、提供的数据类型、宏定义、字符串处理函数、计时器函数等,并列举了一些实用工具函数。
linux+gtk+c/c++ 开发资料收集整理
本文介绍了GLib库的基本概念及常用功能,包括类型定义、宏、内存管理、字符串处理、数据结构等内容。GLib是GTK+和GNOME的基础库,适用于多种平台。
C语言
70,038
社区成员
243,247
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章