Loading... 我们先来看一个例子。 ![](https://blog.fivk.cn/usr/uploads/2021/03/2955052475.png) 我们在main.c打印num <div class='album_block'> [album type="photos"] ![main.c](https://blog.fivk.cn/usr/uploads/2021/03/2067633759.png) ![结果报错](https://blog.fivk.cn/usr/uploads/2021/03/2755194724.png) [/album] </div> 我们打开main.i文件看,num重复定义了 ![](https://blog.fivk.cn/usr/uploads/2021/03/2971083977.png) 这就算头文件重复包含带来的错误。 既然存在这个错误我们应该怎么办??? <div class="tip inlineBlock success"> 可能有的朋友就想,那我们直接避免就好了呀(在main.c里面不用a.h)。但这只是一个小的程序,如果做大了这个难以避免。而且a.h里面可能有我们想要的东西。 </div> 所以今天学习一下如何防止这样的情况。 ## 防止头文件重复包含 ### 方式1:#pragma once **用法:在所有头文件(.h文件)上方编写 #pragma once** * a.h ```c #pragma once #include"b.h" ``` * b.h ```c #pragma once int num = 10; ``` * main.c ```c #include<stdio.h> #include"a.h" #include"b.h" int main(int argc,char *argv[]) { printf("%d\n",num); return 0; } ``` 正常运行:得到结果10 ![](https://blog.fivk.cn/usr/uploads/2021/03/2874774855.png) 我们发现此时.i文件中只定义了一个num ![](https://blog.fivk.cn/usr/uploads/2021/03/62393516.png) 这样我们的问题成功得到了解决。 ### 方式2:c/c++的标准指定 > #ifndef(宏) > > #define(宏) > > 头文件(.c文件)的具体内容 > > #endif * 我们修改了a.h,b.h,main.c * a.h ```C #ifndef __A_H__ #define __A_H__ #include"b.h" #endif ``` * b.h ```C #ifndef __B_H__ #define __B_H__ int num = 10; #endif ``` * main.c ```C #include<stdio.h> #include"a.h" #include"b.h" int main(int argc,char *argv[]) { printf("num = %d\n",num); return 0; } ``` * 运行结果 ![](https://blog.fivk.cn/usr/uploads/2021/03/1525145852.png) * 我们来看看.i文件 ![](https://blog.fivk.cn/usr/uploads/2021/03/2463961621.png) 我们可以发现,第二次int num = 10.直接被删除了。 * 原理:#include<xxx.h> 是直接将xxx.h的文本搬过来。 <div class='album_block'> [album type="photos"] ![图1](https://blog.fivk.cn/usr/uploads/2021/03/3267383989.png) ![图2](https://blog.fivk.cn/usr/uploads/2021/03/395488926.png) [/album] </div> 图1和图2编译结果是一样的。 ## 总结: * #pragma noce 编译器决定 强调的是文件名只能包含一次 * #ifndef c/ c++标准制定 强调宏 而不是文件名 最后修改:2021 年 03 月 10 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏