Loading... 我们先来看一个例子。  我们在main.c打印num <div class='album_block'> [album type="photos"]   [/album] </div> 我们打开main.i文件看,num重复定义了  这就算头文件重复包含带来的错误。 既然存在这个错误我们应该怎么办??? <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  我们发现此时.i文件中只定义了一个num  这样我们的问题成功得到了解决。 ### 方式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; } ``` * 运行结果  * 我们来看看.i文件  我们可以发现,第二次int num = 10.直接被删除了。 * 原理:#include<xxx.h> 是直接将xxx.h的文本搬过来。 <div class='album_block'> [album type="photos"]   [/album] </div> 图1和图2编译结果是一样的。 ## 总结: * #pragma noce 编译器决定 强调的是文件名只能包含一次 * #ifndef c/ c++标准制定 强调宏 而不是文件名 最后修改:2021 年 03 月 10 日 © 禁止转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏