很多时候,C程序员需要在文件头中初始化变量,如果没有好的宏定义方式,往往会导致多个文件引用时,出现大量编译错误。以下C文件头定义方式,可以很好避免这些错误出现:
1.编写c_def.h文件头,内容为:
#undef INIT_DEF_VAR
#undef DEF_EX
#undef DEF_EX_I
#define DEF_EX extern
#define DEF_EX_I(x1) extern x1;
2.编写def_var.h文件头,内容为:
#undef DEF_EX
#undef DEF_EX_I
///////////////////////////////////////////////////////
#define DEF_EX
#define DEF_EX_I(x1) x1
#define INIT_DEF_VAR
3.编写用户文件头,例如eye.h
4.编写另一个用户文件头,例如hd.h
#ifndef __HD_H__
#define __HD_H__
#include "c_def.h"
#ifdef _NOW_DEF_VAR_HD
#include "def_var.h"
#endif
//////////////////////
#include "eye.h" //文件头相互嵌套,没有问题
/////////////////////////
DEF_EX int hdi1; //每一个变量前面添加DEF_EX
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
/////////////////////////////////
struct STDEMO
{
int x;
float y;
};
//以下为有初始化值的变量//如果需要初始化变量前面添加DEF_EX_I
DEF_EX_I(struct STDEMO stDemo1[])
#ifdef INIT_DEF_VAR
={
{33,3.4},
{27,9.7}
};
#endif
//////////////////////////////
void prg2(void);
#endif
5. 编写C函数实体,例如eye.c
#define _NOW_DEF_VAR_EYE //这个宏定义用于实例化在eye.h中定义的变量。书写格式为_NOW_DEF_VER_加上文件头的名字EYE
#include"eye.h"
void prg1(void)
{
testi1=10;
testdat1[1]=20;
testint1=8;
}
6.编写另外一个C函数实体文件,例如hd.c
#define _NOW_DEF_VAR_HD//这个宏定义用于实例化在hd.h中定义的变量。书写格式为_NOW_DEF_VER_加上文件头的名字HD
#include"eye.h"
#include"hd.h"
void prg2(void)
{
testi1=30;
testdat1[1]=15;
hdi1=10;
stDemo1[1].x=5;
}
6.编写主函数main.c
#include"eye.h"
#include"hd.h"
void Main(void)
{
prg1();
prg2();
testi1=12;
testdat1[1]=13;
}
7.编译。结果可以看到,不管文件头.h文件怎么嵌套引用,所有变量(包括初始化了的变量)都不会出现错误或报警。