良人从零开始的踩坑笔记:C语言头文件

因为我上课没好好听


什么是头文件

在程序设计中,特别是在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语句有两种方式包含头文件,分别是使用双引号" "与左右尖括号< >。其区别是(对于不是使用完全文件路径名的)头文件的搜索顺序不同:

使用双引号" "的头文件的搜索顺序:

  1. 包含该#include语句的源文件所在目录;
  2. 包含该#include语句的已经打开的头文件的逆序(因为头文件可以#include另一个头文件构成一个序列);
  3. 编译选项-I所指定的目录
  4. 环境变量INCLUDE所定义的目录

#include “file”
这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 file 的文件。

使用左右尖括号< >的头文件的搜索顺序:

  1. 编译选项-I所指定的目录
  2. 环境变量INCLUDE所定义的目录

#include < file >
这种形式用于引用系统头文件。它在系统目录的标准列表中搜索名为 file 的文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值