头文件,真的很难学
因为我上课没好好听
什么是头文件
在程序设计中,特别是在C语言和C++中,头文件或包含文件是一个文件,通常是源代码的形式,由编译器在处理另一个源文件的时候自动包含进来。一般来说,程序员通过编译器指令将头文件包含进其他源文件的开始(或头部),在C语言和C++中,标准库函数习惯上在头文件中声明。
通常,头文件被用来唯一指定接口,且多少提供一些文档来说明如何使用在该文件中声明的组件。
为什么要用头文件
例如,一个函数在一个源文件中有如下定义:
int add(int a, int b)
{
return a + b;
}
在另一个源文件中引用的时候就可以声明成这样(包含函数原型):
int add(int, int);
int triple(int x)
{
return add(x, add(x, x));
}
但是,这个简单的方法需要程序员为add在两个地方维护函数声明,一个是包含函数实现的文件,以及使用该函数的文件。如果函数的定义改变了,程序员必须要更改散布在程序中的所有的原型。
头文件提供了解决办法。模块的头文件声明作为模块公共接口一部分的每一个函数、对象以及数据类型。例如,在下面的情况下,头文件仅包含add的声明。每一个引用了add的源文件使用#include来包含头文件:
#ifndef ADD_H
#define ADD_H
int add(int, int);
#endif
#include "add.h"
int triple(int x)
{
return add(x, add(x, x));
}
这样就减少了维护的负担:当定义改变的时候,只须更新声明的一个独立副本(在头文件中的那个)。在包含对应的定义的源文件中也可以包含头文件,这给了编译器一个检查声明和定义一致性的机会。
#include "add.h"
int add(int a, int b)
{
return a + b;
}
写头文件
环境:Dev- C++
先要创建项目,把多个源文件新建在同一个项目里
不创建项目而只是放在同一目录下会报错undefined reference
新建后缀为.h的头文件(如add.h),然后把需要的声明放进去,简单的头文件就写好了,但是实际应用上,如果我有n个源文件都include包含了这个add.h头文件,那每次运行的时候都会把这个头文件重新编译一遍,为了防止重复编译以及避免其他的冲突,可以添加以下内容写一个标准的头文件:
#ifndef _ADD_H
#define _ADD_H
...
#endif
_ADD_H为标识,理论上标识可以自由命名,但是一般的规则是 “_文件名大写_H”;
ifndef为 if not define 的缩写,意思是“如果没有被宏定义过”,如果被定义过则返回假,没有被定义过则返回真;
endif配合ifndef使用。
整个头文件的作用是:如果_ADD_H没有被定义过,则定义_ADD_H,并编译…。
头文件还可以有以下几种其他形式:
#ifndef _ADD_H
#define _ADD_H
...
#else
...
#endif
#ifndef _ADD_H
...
#else
...
#endif
但是我不会,因为我学的不好
#include包含头文件
在其他源文件中使用#include就可以包含头文件了:
#include"add.h"
#include语句有两种方式包含头文件,分别是使用双引号" "与左右尖括号< >。其区别是(对于不是使用完全文件路径名的)头文件的搜索顺序不同:
使用双引号" "的头文件的搜索顺序:
- 包含该#include语句的源文件所在目录;
- 包含该#include语句的已经打开的头文件的逆序(因为头文件可以#include另一个头文件构成一个序列);
- 编译选项-I所指定的目录
- 环境变量INCLUDE所定义的目录
#include “file”
这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 file 的文件。
使用左右尖括号< >的头文件的搜索顺序:
- 编译选项-I所指定的目录
- 环境变量INCLUDE所定义的目录
#include < file >
这种形式用于引用系统头文件。它在系统目录的标准列表中搜索名为 file 的文件。