头文件
- 为什么会有头文件;
- 怎么制作头文件;
- 我们的编译器是怎么找到头文件;
- 模块:有组织有结构的来给代码划分模块,处理同一个功能代码,我们放到一个模块里面,
.c文件
假设我们新增一个数学函数源文件,并且添加到编辑器
代码模块的原则:
- 如果这个函数接口,可以公开给外部使用,那么就要把这个函数的声明编写到头文件
- 如果这个函数接口,不给外部使用,那么一定不要把这个函数声明放到头文件
- 注意在编写头文件的时候为了方便维护,一般使用和模块的.c文件同名的.h文件,或有意义的名字
制作头文件
- 怎么来制作文件
- 防止重复包含
当我们要使用这个模块的接口的时候;
我们可以包含这个接口头文件;
防止重复包含的格式
- 防止头文件包含的宏 的格式
- 文件名_H 里面所有的字母都是大写的;
能够节省编译器编译程序所需要的时间
头文件搜索路径
编译器是怎么找到我们的头文件
- 1:
#include ""是在工程项目里面来搜索头文件,./,../; - ./:当前编译的
.c所在的文件夹的位置开始搜索; - 指当前
main.c文件当前所在的文件夹位置 - ../:上一层文件夹;
当前文件夹的下一级查搜索
如果找不到就会到编译器自带的头文件目录下去搜索
如果再找不到回到用户自定义的头文件搜索路径去查找;
- 2:
#include <>- 会去编译器的自带头文件目录下去查找
- 会到用户自定义的头文件搜索路径去查找
-
什么情况下使用<>,什么情况下使用” “
- 1 如果是系统头文件,string.h,stdlib.h等,使用<>
- 2 如果是独立的第三方模块安装的 <>比如 mysql.h
- 如果是自己项目的头文件,一定使用” “
- 为什么不全部使用”“,而还要混合<>来寻找呢??
- 加快编译器搜索头文件的速度;
- 方便我们维护,<>我们知道这个代码模块是来自第三方,或系统库,或外部
extern
声明我们有一个外部模块定义了这个全局变量
隐藏的问题,vc全局变量不加类型也能编译过,当做整数