key.h的内容
#ifndef __Key_h__
#define __Key_h__extern bool KeyScanFlag; //按键扫描标志
extern uchar KeyValue; //按键键值extern void KeyInit(); //按键初始化
extern bool KeyChuli(); //按键防抖处理#endifkey.c的内容
#include "Key.h"bool KeyScanFlag; //按键扫描标志
uchar KeyValue; //按键键值
uchar CurrentKey; //当前按键值
uchar BackupKey; //备份按键值void KeyInit(); //按键初始化
uchar KeyScan(); //按键扫描
bool KeyChuli(); //按键防抖处理
这是别人写的程序,我有点看不明白,为什么我在key.c里面定义的全局变量放在key.h用extern声明,然后又可以把那个key.h放在key.c的开头,这样是不是这个意思,就是说编译器先把key.h包含进来,发现里面的是extern变量,然后在其他文件去找,回到key.c,发现那几个extern就是在key.c里面定义的。我感觉有点怪怪的,为什么不是在key.h定义那几个变量,然后在key.c里面用extern声明。
#ifndef __Key_h__
#define __Key_h__extern bool KeyScanFlag; //按键扫描标志
extern uchar KeyValue; //按键键值extern void KeyInit(); //按键初始化
extern bool KeyChuli(); //按键防抖处理#endifkey.c的内容
#include "Key.h"bool KeyScanFlag; //按键扫描标志
uchar KeyValue; //按键键值
uchar CurrentKey; //当前按键值
uchar BackupKey; //备份按键值void KeyInit(); //按键初始化
uchar KeyScan(); //按键扫描
bool KeyChuli(); //按键防抖处理
这是别人写的程序,我有点看不明白,为什么我在key.c里面定义的全局变量放在key.h用extern声明,然后又可以把那个key.h放在key.c的开头,这样是不是这个意思,就是说编译器先把key.h包含进来,发现里面的是extern变量,然后在其他文件去找,回到key.c,发现那几个extern就是在key.c里面定义的。我感觉有点怪怪的,为什么不是在key.h定义那几个变量,然后在key.c里面用extern声明。
解决方案 »
- 半年没来,此版块如此没落。统计一下每天有多少人活跃在此!
- 仿Windows自带画图程序画直线
- 收藏 不显示删除回复显示所有回复显示星级回复显示得分回复 CListCtrl 添加一个复选框 怎么使得添加到第二列 或者其它列?[
- 知道当前对话框的句柄,怎么获得客户区的高度和长度??
- 程序员联盟 群号:3546259 欢迎it界从事计算机程序的加盟
- 如何让自己的DLL只被载入一次?
- VC的SDK編程中, 一些觉得困惑的问题...难以理解
- 请教一个繁体,简体字体显示问题
- 我对“句柄”,还有API中的很多怪怪的关键字不理解,你能为我指点一下吗?!
- 寻画图源代码
- 请教当图片缩小或放大时,图片的每个象素的亮度值会发生吗?
- 在vs2008中用ADO连接Access的问题。
一般*.h文件有可能在一个工程中但在不同的编译单元中被包含好几次,
因此在*.h文件中不要定义变量,否则会出现重复定义的。
而*.c/*.cpp文件则就是为了定义变量等用的。
楼主还是应该怀疑一下你说看的那个程序的正确性。
========================
实际上一楼的说法是正确,对于多个文件都要用到的全局变量来说,不应该定义在.H文件中,因为头文件很可能被多次引用,而且还有可能会嵌套引用,如果定义在头文件中很容易出现变量重复定义的错误,所以一般对于这些全局都是定义在C文件中,上面的代码中,.H文件中的变量是声明,其实可以去掉,如果其它的C文件要用这些变量,也可以用extern声明一下就可以了。
求证中