【C/C++】ifndef/define/endif的作用

【C/C++】ifndef/define/endif的作用

参考资料来源于网上,还未经本人实验证明。

主要作用

  防止头文件被重复包含和编译。
  解释#ifndef起到的效果是防止一个源文件两次包含同一个头文件。那么一个源文件为什么会两次包含同一个头文件呢?
  情况1:你写的test.cpp里包含了a.hb.ha.h里包含了b.h,所以b.h就会被包含和编译两次。

/*name: test.cpp*/
#include <a.h>
#include <b.h>
······
/*name: a.h*/
#include <b.h>
······

  情况2:你写的test.cpp里包含了a.hb.ha.h里包含了b.hb.h里包含了a.h,所以a.hb.h就会循环包含和编译。

/*name: test.cpp*/
#include <a.h>
#include <b.h>
······
/*name: a.h*/
#include <b.h>
······
/*name: b.h*/
#include <a.h>
······

隐藏危险

  1、重复定义:在情况1里,如果b.h中定义了一个变量,在编译test.cpp时就会报重复定义的错误。解决办法:不要在头文件中定义变量。
  2、无限循环编译:情况2编译器会报Error #include nested too deeply的错误。解决办法:把b.h改写成:

#ifndef _A_H_
#define _A_H_
#include <a.h>
#endif
······

这样子编译test.cpp,当编译到b.h时,编译器能进行判断之前有没有编译过#include<a.h>,如果已经编译过了,则不再重复编译。

解决办法

  所有头文件前后都加上ifndef/define/endif。

reference

1、主要目的:https://zhidao.baidu.com/question/22559696.html 如下图所示。
【C/C++】ifndef/define/endif的作用
2、隐藏危险-重复定义:https://www.jb51.net/article/100939.htm
3、隐藏危险-无限循环编译:https://blog.csdn.net/weixin_41656968/article/details/80493923

上一篇:#if和#ifdef的区别


下一篇:VA01隐藏销售凭证流的金额