###编译中重定义错误的处理
在编译代码的时候会有各种各样的错误,本文主要说下重定义的错误处理。这个大家应该都遇见过,无非就是变量或者函数定义重复了啊,对,简单来说就是这样的,经常出现先复制变量或者代码的时候忘记改名,这种根据题提示很好解,另外就是头文件书写错误时候会出现。
###头文件的写法
这里给出正常的头文件(hh.h)的书写形式,我们写代码经常一个源文件.c与匹配一个头文件.h,这是一个好习惯。那么在在头文件中写些什么呢,一般写所包含的的头文件,宏定义,变量和函数申明,结构体和枚举类型的别名等。
**#ifndef __HH_H__
#define __HH_H__**
#define b 20
typedef enum
{
MON,
TUE,
WED,
THU,
TRI
} workday;
void add();
**#endif**
头文件加上预编译代码 #ifndef __HH_H__
可以防止该头文件被重复引用,也很好理解,就是如果定义了__HH_H__
,就说明该头文件已经应用过,并不进行下面代码一直到最后行的#endif,如果没定义就定义下,然后引用头文件。
这里指出下,__HH_H__
这个值我们一般依照头文件名来写,前后两个下划线,中间的点也用下划线代替,全部大写的形式。当然,有人好奇可不可以写成别的,可以,只要保证唯一就行!但是没必要也不推荐,建议按约定俗成的来。
分析头文件的不当写法
再回到之前的问题,就是头文件格式书写不正确或者内容不正确时会导致的重定义问题。
1 . 忘写定义的那行(一般头文件第二行)
这样__HH_H__
的宏定义一直没有,这样与第一行的#ifndef __HH_H__
和最好一行#endif
也不写是一样效果。如果出现a.c里面引用了b.h个c.h,b.h也引用c.h,就会出现重定义的错误。
#ifndef __HH_H__
//#define __HH_H__
#define b 20
typedef enum
{
L2_ALWAYS = 0,
L2_FATAL,
L2_ERROR,
L2_EVENT,
L2_WARNING,
L2_INFO,
L2_DEBUG,
L2_MAX_LOG_LEVEL
} L2_LOG_LEVEL;
void add();
#endif
2 . 在头文件中去定义变量
要养成一种意识就是,定义变量要在源文件.c中进行,头文件只是用来申明的!
我们经常的做法是在源文件中定义全局变量 int g_nCount = 26;
,别的文件也要用的时候,我们会在这个源文件对应的头文件里加上extern 的声明 extern int g_nCount;
,值得指出的是,千万别写成extern int g_nCount = 26;
,这是错误的!声明不要接上赋值,这就属于定义!
关键字extern 就是用来在有文件中申明变量或函数,告诉编译器这里只是申明,在别的位置去寻找定义!所以,不会出现重定义的错误。