#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
- #define#ifndef#endf 防止头文件重复包含,心得,供大家参考
- "#ifndef #define #endif"防止头文件被重复包含
- "#ifndef #define #endif ”防止头文件被重复包含
- #ifndef#define#endif防止头文件重复包含
- #ifndef#define#endif防止头文件重复包含
- #ifndef#endif防止头文件重复包含
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- 防止头文件的重复包含和编译及重定义错误(ifndef/define/endif 用法)
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- #ifndef#define#endif防止头文件重复包含, 你不是真的懂
- #ifndef #define #endif ”防止头文件被重复包 .
- #ifndef/#define/#endif 防止该头文件被重复引用
- 防止头文件重复包含之pragma once与#ifndef
- #ifndef与#pragme once区别防止头文件重复包含
- oc增强之手动内存管理
- iOS学习笔记之图片转NSString,再还原
- java rxtx串口通信遇到Error 0x5 at ..\src\termios.c(892): 拒绝访问
- IOS AutoLayout详解(三)用代码实现(附Demo下载)
- libvirt-virsh命令
- #define#ifndef#endf 防止头文件重复包含,心得,供大家参考
- 在ubuntu下配置windows访问ubuntu环境
- iOS中的数据持久化方式
- BING(Binarized Normed Gradients for Objectness )的一些分享
- 运行127.0.0.1
- 分治策略
- 1个Nginx+2个tomcat+2个redis服务器(主从复制)实现反向代理,实现动静分离。
- 深入理解volitale关键字
- 【NOIP2015】总结与反思