我们平时写裸机程序是一般都是在.c文件里面定义全局变量。然后再.h里面用extern声明全局变量。
但是有的时候我们写程序比较大的时候头文件很多,我们就需要不断的对同一全局变量重复声明,这样很繁琐而且低效。所以我们需要一种只需要在一种定义一次其它文件就不需要写声明的方法。在看到uC/Os 实时操作系统源码的时候我发现了这种方法。
比如我把全局变量定义在a.h文件里面。如下
#ifdef QUANJU
#define EXTN //定义EXTN为空
#eles
#define EXTN extern
#endif
EXTN char g_test1;
然后在b.c:
#define QUANJU
#include "a.h"//在该文件中a.h定义了一次g_test1
在d.c:
#include "a.h"//在该文件中a.h声明g_test1
上面三个文件中a.h文件里面的功能是:假如定义了QUANJU则EXTN 为空, 就把“EXTN char g_test1;”当成全局变量g_test1的定义(即 char g_test1)。假如没有定义QUANJU则EXTN 为extern,就把“EXTN char g_test1;”当成声明(即“extern char g_test1”)
然后无论什么文件使用全局变量g_test1,只要调用a.h,就不用再声明了。因为只要调用a.h由于没有宏定义QUANJU所以就等于在a.h声明了g_test1。只有b.c文件里面宏定义了QUANJU所以b.c里面调用的a.h就是定义g_test1。