编译中重定义错误的处理--头文件的写法

###编译中重定义错误的处理
在编译代码的时候会有各种各样的错误,本文主要说下重定义的错误处理。这个大家应该都遇见过,无非就是变量或者函数定义重复了啊,对,简单来说就是这样的,经常出现先复制变量或者代码的时候忘记改名,这种根据题提示很好解,另外就是头文件书写错误时候会出现。

###头文件的写法
这里给出正常的头文件(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 就是用来在有文件中申明变量或函数,告诉编译器这里只是申明,在别的位置去寻找定义!所以,不会出现重定义的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值