通常我们定义全局变量的做法都是在.C文件里面定义全局变量,然后在这个文件对应的头文件里面加 extern 声明,在外部文件调用的时候,包含其头文件,加入全局变量的声明(不加也是可以的,最好加上,包含
.h文件的时候已经把声明加入了)
//test.c int a; //test.h extern int a; //main.c #include "test.h" extern int a; int main() { pirntf("a = %d\n", a); }
但是 uC/OS-III 中,文件非常多,这种方法可行,但不现实。因此ucos-iii使用了一种比较巧妙的方式去实现在头文件中定义变量。在 os.h 头文件中定义全局变量,然后在 os.h 文件的开头加上如下代码段
#ifdef OS_GLOBALS #define OS_EXT #else #define OS_EXT extern #endif
并另外新建了一个 os_var.c在里面包含 os.h,且只在这个文件里面定义 OS_GLOBALS 这个宏
#define OS_GLOBALS #include "os.h"
经过这样处理之后,在编译整个工程的时候,只有 var.c 里面的 os.h 的 OS_EXTI 才会被替换为空,即变量的定义,其它包含 os.h 的文件因为没有定义 OS_GLOBAS 这个宏,则OS_EXTI 会被替换成 extern,即变成了变量的声明。这样就实现了在头文件中定义变量。