亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C 语言头文件详解:类型、用法与最佳实践

头文件是扩展名为 .h 的文件,包含 C 函数声明和宏定义,供多个源文件共享。头文件分两类:程序员自定义的头文件和编译器自带的系统头文件。

在程序中使用头文件,需通过 C 预处理指令 #include 引入,如你常见的 stdio.h 即为编译器自带的系统头文件。

引入头文件等同于将头文件内容复制到源文件,但直接复制容易出错,且在多源文件项目中并不推荐。通用做法是将常量、宏、系统级全局变量和函数原型放在头文件中,在需要处引入该头文件。

引入语法

用户和系统头文件均使用 #include 指令引入,有两种形式:

#include <file>

此形式用于系统头文件。它在标准系统目录列表中搜索名为 'file' 的文件。编译时可用 -I 选项预pend 目录到搜索列表。

#include "file"

此形式用于自定义头文件。它在当前文件所在目录搜索 'file'。同样可用 -I 选项添加搜索目录。

引入操作

#include 指示 C 预处理器在继续处理当前源文件前,先扫描指定文件作为输入。预处理器输出包含:已生成的输出、被引入文件产生的输出、以及 #include 指令后文本产生的输出。例如,头文件 header.h 内容如下:

char *test (void);

主程序 program.c 引用该头文件:

int x;
#include "header.h"
int main (void) {
    puts (test ());
}

编译器看到的标记流等同于 program.c 直接包含以下内容:

int x;
char *test (void);
int main (void) {
    puts (test ());
}

防止重复引入

若头文件被引入两次,编译器会处理两次内容导致错误。标准做法是用条件编译包裹头文件实体内容:

#ifndef HEADER_FILE
#define HEADER_FILE
/* 整个头文件内容 */
#endif

此结构称为 #ifndef 包装器。再次引入时,条件为假(因 HEADER_FILE 已定义),预处理器跳过整个文件内容,编译器不再重复处理。

计算引入

有时需根据条件选择引入不同头文件(如不同操作系统的配置参数)。可用条件编译系列实现:

#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif

但条件过多时繁琐,预处理器允许用宏作头文件名,称为 计算引入。不直接写头文件名,而是放宏名:

#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

SYSTEM_H 会被展开,预处理器按原方式查找 system_1.h。SYSTEM_H 可通过 Makefile 的 -D 选项定义。

C语言

  1. 理解 STL 文件:3D 打印的基石
  2. 用 Go 轻松托管静态文件:经验证的方法
  3. 三角锉刀详解:设计特点、用途与保养
  4. 平锉刀:木工金属加工必备修整工具全解析
  5. C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
  6. C 语言文件 I/O 实战:创建、打开、读写与二进制操作
  7. C++文件I/O完全指南:fstream读写、打开模式、定位指针与完整实例
  8. C# 文件 I/O 完全指南:流、读写操作与文件系统管理
  9. 掌握 Verilog 文件 I/O:打开、读取、写入和关闭
  10. Python 文件 I/O:掌握文件操作、读写与管理
  11. Python 文件 I/O:掌握输入输出操作
  12. 掌握 Java 文件操作:java.io 包下的创建、读取、写入与删除