【C/C++】ifndef/define/endif的作用
参考资料来源于网上,还未经本人实验证明。
主要作用
防止头文件被重复包含和编译。
解释:#ifndef
起到的效果是防止一个源文件两次包含同一个头文件。那么一个源文件为什么会两次包含同一个头文件呢?
情况1:你写的test.cpp
里包含了a.h
和b.h
,a.h
里包含了b.h
,所以b.h
就会被包含和编译两次。
/*name: test.cpp*/
#include <a.h>
#include <b.h>
······
/*name: a.h*/
#include <b.h>
······
情况2:你写的test.cpp
里包含了a.h
和b.h
,a.h
里包含了b.h
,b.h
里包含了a.h
,所以a.h
,b.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 如下图所示。
2、隐藏危险-重复定义:https://www.jb51.net/article/100939.htm
3、隐藏危险-无限循环编译:https://blog.csdn.net/weixin_41656968/article/details/80493923