详解#ifndef处理头文件嵌套
#ifndef处理头文件嵌套:
每个yuan文件都只能包含一次某个头文件;
但有的时候,在b头文件中声明原型时,必须要用到a头文件中的内容,如下:
yuan2.h中声明dis()函数原型就需要用到yuan.h中的Stu类声明;
而这样的话,在main函数所在的.cpp文件中,就无法同时include”yuan1.h”和
“yuan2.h”,因为“yuan2.h”包含“yuan1.h”,这样就会在这个.cpp文件中出现两次“yuan1.h”。
然而在预处理时,编译器会将头文件声明所在的地方直接替换并展开成头文件中的内容!即下面两图(第一张是预处理前,第二张是预处理后):
替换后发现,“yuan.cpp“中出现了两次Stu类的定义,这会导致重定义的错误而使程序无法运行;
此类问题的解决办法就是使用#ifndef,如下:
说明:#ifndef即“if not define“,预处理时,如果编译器第一次遇见#ifndef YUAN1,就会直接define YUAN1(因为之前没有define过),在后续的预处理中,如果再次遇到#ifndef YUAN1,编译器会直接跳到endif而忽略两者之间的内容(因为已经define过YUAN1了),这样就可以在.cpp文件中只包含一次”yuan1.h”了(YUAN2同理)。下面看一下具体过程:
- 先预处理”yuan2.h”(因为在源.cpp中,”yuan2.h”在”yuan1.h”之前),碰见#ifndef YUAN2,啊哈,这是我第一次遇见你,之前没有定义过,好的,那么现在define YUAN2,并执行#ifndef和#endif之间的代码,即include“yuan1“; 编译器在后续预处理时将记住我已经define 过YUAN2啦!
- 在展开yuan2.h时,发现yuan2.h中引用了yuan1.h,所以继续展开,碰见#ifndef YUAN1,这也是第一次遇见,ok,那就define YUAN1,后续碰见yuan1.h就不再展开!
- 然后预处理”yuan1.h”,碰见#ifndef YUAN1,由于之前已经定义过了,所以不再执行中间的代码(即不再include”yuan1.h”)
- 最终在cpp文件中,只存在一个Stu的定义啦
补充说明:
- 其实在我们写代码的时候,编译器就已经把头文件的内容隐式地展开了,并不完全是预处理时期才展开。
- 头文件中只放函数声明,源文件中放定义!
- yuan1.cpp是存放函数定义的文件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术