来历:
先看最简单的程序:hello world
/test1.c/
main(){printf("Hello World!\n");}
注意,test1中并没有.h文件,编译可以顺利通过。把程序做下改动,下面这个:
/test2.c/
prtstr(){printf("Hello World!\n");}main(){prtstr();}
test2.c中还是没有.h文件,编译仍可以顺利通过。再把程序改动下:
/test3.c/
main(){prtstr();}prtstr(){printf("Hello World!\n");}
test3.c中仍然没有.h文件,编译失败→_→。难道函数的位置影响编译的过程?现在我们来熟悉一下C语言中的概念:作用域。
我们在这里只讲述与.h文件相关的顶层作用域, 顶层作用域就是从声明点延伸到源程序文本结束, 就prtstr()这个函数来说,他没有单独的声明,只有定义,那么就从他定义的行开始,到文件结束, 也就是说,在test2.c的main()函数的引用点上,已经是他的作用域。 test3.c的main()函数的引用点上,还不是他的作用域,所以会编译出错. 这种情况怎么办呢? 有两种方法 ,一个就是让我们回到test2.c, 顺序对我们来说没什么, 谁先谁后不一样呢,只要能编译通过,程序能运行, 就让main()文件总是放到最后吧。那就让我们来看另一个例程,让我们看看这个方法是不是在任何时候都会起作用.
/test4.c/
play2(){play1();}play1(){play2();}main(){play1();}
这就是经常用到的一种算法, 函数嵌套。play1 和play2 这两个函数哪个放到前面呢?这时就需要我们来使用第二种方法,使用声明.
/test5.c/
play1();play2();play2(){play1();}play1(){play2();}main(){play1();}
一个大型的软件项目,可能有几千个,上万个 play, 而不只是 play1,play2这么简单, 这样就可能有 N 个类似 play1(); play2(); 这样的声明, 这个时候就需要我们想办法把这样的 play1(); play2(); 另行管理, 而不是把他放在.c文件中, 于是.h 文件出现了.
/*test.h */play1();play2();/* test6.C */#include “test.h”play2(){play1();}play1();{play2();}main(){play1();}
1.什么时候需要头文件
首先,来看一个最基本的程序。
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf(“hello world”);
return 0;
}
这里要是没了头文件,一定会编译不过。理由很简单,我们使用了printf()函数,而这个函数就是在#include <stdio.h>这个头文件中定义的。只不过,这个头文件和这个函数并不需要我们去编写,这是由于在C语言标准中就已经帮我们实现好了的,当然C语言标准中并不只是提供了这一个头文件。当我们需要使用某个函数我们去查询对应的头文件,然后引入即可(linux中的man手册是个好动西)。
答:什么时候需要头文件?当然是我需要调用某个函数时,而这个函数是已经定义好的,我们直接引用对应的头文件即可
h文件作用:
1.方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明;2.使函数的作用域从函数声明的位置开始,而不是函数定义的位置(实践总结);3 .提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h)。4、加强类型检查,提高代码的类型安全性;5、减少代码的重复书写,提高编写和修改程序的效率;4、提供保密和代码复用的手段,用户只需要按照头文件的接口声明来调用库功能,编译器会从库中提取相应的代码。
2.如何解决头文件重复包含导致的问题?
什么是头文件重复包含问题?
如果头文件A包含头文件C,同时头文件B也包含头文件C,而写的程序中包含了头文件A,头文件B,然后在编译的时候就会出现头文件C重复包含的错误。
解决方法:
方法1:(最常用)
#ifndef X //X为你的标识符,保持唯一,比如HEADER_One_H#define X//定义Xheader1.h//这里是你的头文件#endif// 宏结束行
上面的X可以随便取名(可以用来“装”头文件,所以X一般取名为大写的头文件的名字,只不过把”.”换成“_”),只要保证#ifndef和#define后面是同一个X就可以了,只是一个标识而已。翻译成中文就是,如果已经#define X了,后面的就不执行了。这样在同一个c文件中,保证可以只#include一个头文件,避免“在同一个c文件中对一个头文件include两次”的错误。
方法2:(较少使用)
#pragma once 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次
#pragmaonce这种方式,是微软编译器独有的,也是后来才有的,所以知道的人并不是很多,用的人也不是很多,因为他不支持跨平台。如果你想写跨平台的代码,最好使用上一种。这是一种由编译器提供支持的方式,防止同一文件的二次编译,这里的同一文件指的是物理文件。
本文介绍了C语言中头文件的作用,当需要调用预定义函数时需引入对应头文件。同时,针对头文件重复包含可能导致的问题,提出了两种解决方案:使用条件编译指令防止重复包含和使用`#pragma once`编译器指令。这两种方法可确保头文件在编译过程中仅被包含一次。
3722

被折叠的 条评论
为什么被折叠?



