【C语言初阶】文件结构(头文件结构,头文件作用,头文件被重复包含的问题)

一、头文件

1. 头文件的作用

1. 不用在各个源文件中做重复的声明

2. 组织项目结构的时候,减少大型项目的维护成本(修改了定义,只需修改头文件中对应的声明)

3. 通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。(下文有编译和使用二进制库的详细过程)

4. 头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。

2. 头文件的命名

头文件最好与对应的源文件同名(main.c不需要),源文件中存放定义,而头文件中存放声明

3. 头文件的结构

1. #pragma once或ifndef/define/endif 结构(为防止头文件被重复引用)

2. 标准库的头文件 (#include <...>)

3. 非标准库的头文件 (#include "...")

4. #define宏定义

5. typedef自定义类型

6. 构造类型的声明(如结构体,枚举等)

7. 全局变量的声明(必须加extern)

8. 函数的声明(建议加extern)

注意:头文件中只能写全局变量的声明,不能定义全局变量,否则在链接时会造成重定义错误。(除非定义成static全局变量,仅在当前文件可见)

4. extern声明

1. 全局变量的声明必须带上extern。因为头文件中只能包含声明,不带extern无法确定到底是声明还是定义

2. 函数的声明建议带上extern。建议函数怎么定义就怎么声明(包括参数类型和参数名)便于理解代码。

3. 为什么全局数据的链接属性默认是外部的?因为多个文件之间后续一定要进行数据交互。

5. 头文件被重复包含的问题

1. 头文件被重复包含是下面这样的现象:

A文件里包含了C文件,

B文件里也包含了C文件,

然后A文件又把B文件包含了进来。

这样,相当于A文件包含了两次C文件,这就是文件包含处理时文件被重复包含的问题。

文件包含时重复包含问题有时候会带来一些问题,典型的就是重定义问题,会导致编译通不过。或者编译通过,但是会造成编译效率降低。

2. 如何防止头文件被重复多次的包含?

方法一:

方法二:

二、定义文件(源文件)

1. 源文件的结构

1. 对一些头文件的引用

2. 全局变量的定义

3. 函数的定义

2. 源文件的双重保护

1. static封装具体的业务流程(实现了对源文件业务流程细节的保护)

2. 将源文件编译成静态库文件(隐藏源代码的内容,通过头文件来调用库功能)

3. static为源文件提供安全保证:

将源文件中实现具体细节的函数和全局变量用static修饰,封装在源文件内。

只将有外部需求的功能性函数暴露在头文件中。这样就实现了对源文件业务流程细节的保护

4. 如何将源文件编译成静态库文件?(环境VS2013):

开发者:

1. 编写源文件和头文件(文件公开时应在头文件中介绍函数的使用方法。)

 

2. 将项目(项目包括源文件和头文件)属性中的配置类型改为静态库

3. 重新编译程序

4. 在项目文件夹中的Debug文件夹下会产生静态库文件(.lib),该文件为二进制文件无法阅读

 

用户:

1. 将静态库文件和对应的头文件,放到项目文件夹下。

2. 将头文件导入项目文件,使用#include "***.h"预处理指令引用头文件

3. 使用#pragma comment(lib,"***.lib")预处理指令导入静态库。

4.调用在头文件中声明的函数

 5. 运行程序

 三、分享交流

        欢迎在评论区交流!如果文章有错误还请大家指出!

返回专栏目录https://blog.csdn.net/zty857016148/article/details/127068555

  • 24
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芥末虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值