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声明。

解决方案 »

  1.   

    这就要考虑到编译单元的问题了
    一般*.h文件有可能在一个工程中但在不同的编译单元中被包含好几次,
    因此在*.h文件中不要定义变量,否则会出现重复定义的。
    而*.c/*.cpp文件则就是为了定义变量等用的。
      

  2.   

    对一楼的说法表示不赞同。 
    楼主还是应该怀疑一下你说看的那个程序的正确性。
    ========================
    实际上一楼的说法是正确,对于多个文件都要用到的全局变量来说,不应该定义在.H文件中,因为头文件很可能被多次引用,而且还有可能会嵌套引用,如果定义在头文件中很容易出现变量重复定义的错误,所以一般对于这些全局都是定义在C文件中,上面的代码中,.H文件中的变量是声明,其实可以去掉,如果其它的C文件要用这些变量,也可以用extern声明一下就可以了。
      

  3.   

    我知道1楼的意思,其实如果是其他文件用key.h,我觉得没什么问题,我就是觉得在key.c还包含key.h有点怪怪的,
      

  4.   

    是不是这样理解呢:C++环境下,在.h文件中定义extern bool key;,在.cpp中还可以定义bool key;。程序编译的时候,先检查.cpp中是否有bool key的定义,有则不再调用.h文件的extern bool key;没有的情况下才调用.h。
    求证中