防止头文件的重复引入__2018.05.03

预防头文件重复定义,其实是说在预防在一个工程文件中防止重复拷贝此头文件中的内容。在其他工程文件中还是会进行拷贝引入的。

1.编译期间,我们只要声明了的东西就能使用,声明可以重复,但定义只能有一次。extern在编译时是告诉该编译单元该变量的定义在别的编译单元里,相当于声明,链接时,定义在整个程序中有且仅有一份。在不同文件中的重复定义,编译是可以通过的,但链接时就会出错。

#ifndef #define #endif 用来防止某个宏被多次定义
格式: 
      #idndef  宏名
      #define  宏名
      *********
      *********

      #endif 

<宏名>:宏名大家都知道的没什么好说的了吧,但是呢还是需要提醒两句的,基本上是*.h的大写字母,“.”通常替换成”_”,前后加下划线,其实不加也没问题,但是一定要有自己的习惯啦......


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

2.预编译阶段,当第一次执行该段代码(即#include "a.h")时,由于我们并没有宏定义A_H_,所以会执行#define A_H_以及void fun()两条语句,第二次执行该段代码时因为#ifndef A_H_为假就直接走到#endif后面也就等于该次#include "a.h"什么也没做了。

3.当我们一个简单的project中有三个文件main.cpp,a.cpp,a.h,而 main.cpp 和a.cpp分别包含了a.h,在编译阶段,两个编译单元是都会分别包含a.h的,即使他们使用了#ifndef#define#endif,这也是为什么当a.h被多个文件包含时我们不允许在a.h中定义变量及函数的原因, 因为在链接阶段会出现重定义。但是在a.h中定义一个static变量却是允许的,因为static变量是模块性作用域,就这个例子来说, 我们在a.h中写static int sss = 0;那么main.cpp与a.cpp使用的sss将为2个独立的sss.

  那么是否#ifndef#define#endif就没用了呢,大家可以想想,当我们a.cpp中写了多个#include "a.h"时,如果我们使用了#ifndef#define#endif那么预编译阶段就只会包含一个a.h中的内容到a.cpp中,你也许会说,有谁会傻到在a.cpp中写多个#include "a.h"呢,那么请考虑稍微复杂点的情况,当我们main.cpp中包含了a.h和b.h,而a.h中我们又包含了b.h,那么如果我们使用了#ifndef#define#endif则main.obj只会包含一份b.h

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值