C语言-预处理之头文件

一、头文件的作用

通常,个常规的C语言程序会包含多个源码文件(c),当某些公共资源需要在各个源码文件中使用时,为了避免多次编写相同的代码,一般的做法是将这些大家都需要用到的公共资源放入头文件(h)当中,然后在各个源码文件中直接包含即可。

二、头文件的内容

头文件中所存放的内容,就是各个源码文件的彼此可见的公共资源,包括

  1. 全局变量的声明
  2. 普通函数的声明。
  3. .静态函数的定义
  4. 宏定义。
  5. 结构体、联合体的定义
  6. 枚举常量列表的定义
  7. 其他头文件。

示例代码: 

// head .h
extern int global; // 1,全局变量的声明
extern void f1(); // 2,普通函数的声明
static void f2() // 3,静态函数的定义
    {
        ...
    };

#define MAx(a,b) ((a)>(b)?(a):(b)) // 4,宏定义
struct node// 5,结构体的定义
    {
        ...
    };

union attr// 6,联合体的定义
    {
        ...
    };

#include <unistd.h> // 7,其他头文件
#include <string.h>
#include <stdint.h>

特别说明:
        a.全局变量、普通函数的定义一般出现在某个源文件(".c*.cpp)中,其他的源文件想要使用都需要进行声明,因此一般放在头文件中更方便。
        b.静态函数、宏定义、结构体、联合体的定义都只能在其所在的文件可见,因此如果多个源文件都需要使用的话,放到a头文件中定义是最方便,也是最安全的选择。

三、头文件的使用


头文件编写好了之后,就可以被各个所需要的源码文件包含了,包含头文件的语a句就是如下预处理指令:

// main.c
#include"head.h” // 包含自定义的头文件
#include"stdio.h”// 包含系统预定义的文件

int main()
    {
        ...

    }

可以看到,在源码文件中包含指定的头文件有两种不同的形式
 ·使用双引号:在指定位置+系统标准路径搜索head.h
 ·使用尖括号: 在系统标准路径搜索stdio.h


一个简易示例

由于自定义的头文件一般放在源码文件的周围,因此需要在编译的时候通过特定的选项来指定位置,而系统头文件都统一放在标准路径下,一般无需指定位置。
假设在源码文件 main.c 中,包含了两个头文件: head.h 和 stdio.h,由于他们一个是自定义头文件,一个是系统标准头文件前者放在项目 pro/inc 路径下,后者存放于系统头文件标准路径下(一般位于usr/include),因此对于这个程序的编译指令应写作:

gec@ubuntu:~/pro$ gcc main.c -o main -I /home/gec/pro/inc

其中,/home/gec/pro/inc 是自定义头文件 head.h 所在的路径
     ·语法要点:
        预处理指令 #include 的本质是复制粘贴: 将指定头文件的内容复制到源码文件中.

        系统标准头  文件路径可以通过编译选项 -v 来获知,比如:

gec@ubuntu:~/pro$ gcc main.c -I /home/gec/pro/inc -v
... ...
#include "..."search starts here:
#include <...> search starts here:
    /usr/lib/gcc/x86 64-linux-gnu/7/include
    /usr/local/include
    /usr/lib/gcc/x86 64-linux-gnu/7/include-fixed
    /usr/include/x86 64-linux-gnu
    /usr/include
... ...

四、头文件的格式

由于头文件包含指令 #include 的本质是复制粘贴,并且一个头文件中可以嵌套包含其他头文件,因此很容易出现一种情况是头文件被重复包含
     ·使用条件编译,解决头文件重复包含的问题,格式如下:

#ifndefHEADNAME H
#define HEADNAME H
...
...头文件正文
...

#endif

其中,HEADNAME一般取头文件名称的大写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值