#define#ifndef#endf 防止头文件重复包含,心得,供大家参考

来源:互联网 发布:mac队全灭第几集 编辑:程序博客网 时间:2024/05/16 10:58
这其实是以前我参加智能车大赛留下来的一个问题,智能车里面头文件很多,用到的就是这个,到今天晚上没事干突然间想到了就查了些资料,豁然开朗,今晚算是真的懂了,我就用自己的思想来讲一些吧,如哪里有不妥,可以一块探讨,我用的调试环境是vc2015,接下来步入正题。***************************************************************************************************************************************#ifndef #define #endif 用来防止某个宏被多次定义格式:       #idndef  宏名      #define  宏名      *********      *********      #endif ***************************************************************************************************************************************<宏名>:宏名大家都知道的没什么好说的了吧,但是呢还是需要提醒两句的,基本上是*.h的大写字母,“.”通常替换成”_”,前后加下划                 线,其实不加也没问题,但是一定要有自己的习惯啦......
***************************************************************************************************************************************
首先呢 假设有一个fipped.h的头文件 这就相当于一个if语句 可以理解为

     #idndef  _FIPPED_H      *     //如果没有定义  宏名 _FIPPED_H        *  if(!_FIPPED_H)        #define  _FIPPED_H          *      //则定义一个    _FIPPED_H                *    {      *********                   *                                                 *      #define _FIPPED_H      //定义内容                  *                                                 *      定义内容      *********                   *                                                 *      #endif      #endif                      *      //结束                                     *     };
*************************************************************************************************************************************

我们可以把每个头文件的都理解一个人,而每个头文件对应的宏名是一个身份证号(例如:www.h对应 _WWW_H)
当你在主函数调用头文件的时候有可能过多次调用,例如一个fipped.h的头文件你不小心在主函数复制了两次,当程序运行到第一次的时候;
一切都正常运行,但是呢到第二次的时候,头文件里的那个宏名 _FIPPED_H_已经在第一次运行时被定义过了,你在看我的那个形象化的if语句,
如果没定义过
_FIPPED_H_则定义一个宏名和执行一些定义的内容,但是呢,你在第一次已经执行过一次了,从而if语句就不成立了,
然后if的方括号里面的定义的一些东西也就不会被程序运行了,从而避免了头文件被重复调用带来的错误。接下来用例子讲解一下》

*************************************************************************************************************************************

我定义了一个 qwer.h和fipped,h,和几个main.cpp的代码如下:

//***qewr.h*****#ifndef _FIPPED_H#define _FIPPED_Hint j;#endif//***fipped.h****#ifndef _FIPPED_H#define _FIPPED_Hint i ;#endif********************************************************************************************************************************************************** 
发现了吗,qwer.h的代码和fipped.h的代码是一样的,只不过一个定义了i,一个定了j,然而在编译的时候,先执行#include"fipped.h", 执行过后,
i变量定义了,所以初始化的时候没有错误,然后执行#include"qwer.h",注意这个宏定义跟fipped.h中的宏定义是一样的(因为我就是复制的),
这个宏在前面那个定义过了,所以那个我形象化的if条件就不成立了,自然而然地的j变量就不会存在了,所以会报错。

然而如果把mian.cpp中如果你把#include"qwer.h"放在#include"fipped.h"之前,编译的时候就会提示i未声明标识(已经实践过了,就不晒图了),自己体会吧****
当然这个例子有点特殊比较简单,然而却使我恍然大悟的,或许并没有代表性,当然在真正的大程序之中呢,头文件是非常多的,一个头文件可能被多个*.cpp文件调用
假设B.cpp和C.cpp使用的函数都调用了A.h中的取绝对值函数,而在D.cpp中又分别调用了B.cpp和C.cpp,然而在main.cpp中你调用了A.h B.h. C.h. D.h
是不是就相当于调用了四次A.h呢,然而使用了#define#ifndef#endf就相当于只调用了一次,从而避免重复调用.....
*******
当然同样有一个缺点,那就是当两个头文件用的宏名有相同的,那么必然有一个头文件不可用,同样可以用上面的例题讲解,用的就是宏名相同,结果j未声明标识符
在大程序中出现这样的错误是致命的吧....


还有一个,如果在头文件中使用这个,尽量避免定义变量,比如 int i;当然我的程序太简单了,如果是大程序,如果别的程序里定义了i,就会出现重定义,从而出错


************全是个人见解********不喜勿喷*********错的地方请改正**********

 




                                             
1 0
原创粉丝点击