这些文章是 作者看一些优秀的代码的学习笔记。本篇是uc_os中的一些代码。
有不对的地方,欢迎大家拍砖指正。共同进步,O(∩_∩)O~
防止重复定义的extern技巧的使用
如:自己创建一个工程,全局变量应该是得到内存分配并且可以被其他模块通过C语言中的extern关键字调用的变量。因此,必须在 .C 和 .H 文件中定义或是通过extern来引入,这种重复的定义很容易导致错误。
以下讨论的方法只需在头文件中定义一次,这就是学习本文的目的。
module_name_head.h中
#ifdef module_name_GLOBALS
#define module_name_EXT
#else
#define module_name_EXT extern
#endif
module_name_EXT INT8U method_name(); // 对方法的声明
module_name_head_common.c中
#define module_name_GLOBALS // 此文件中定义了此宏(module_name_GLOBALS ),所以最好把公用的方法,对外的接口的实现都写在此文件。
#include "module_name_head.h"
module_name_EXT INT8U method_name()
{
// 实现此方法;
// 此方法是对外的接口,或是本项目中公用的方法;
}
module_name_file_1.c中
#include "module_name_head.h"module_name_file_2.c中
#include "module_name_head.h"module_name_file_3.c中
#include "module_name_head.h"
这样的话,在 其余的文件中file_1.c 和 file_2.c 和 file_3.c 中:
module_name_EXT其实都是extern,所以它们都是对module_name__head_common.c文件中
INT8U method_name()方法的引用;代码中对该方法的调用就ok了。
因此不会出现重复定义的情况。
若是需要添加一个公用方法的话,只需在 XXX_head.h 头文件中添加一个声明,在XXX_head_common.c中添加实现就ok了。