C语言教程(二十二):C 语言头文件详解

一、头文件的定义与形式

        头文件一般具有 `.h` 扩展名,它主要用来存放函数声明、宏定义、结构体和共用体的定义、全局变量的声明等内容。在C语言程序里,可借助 `#include` 预处理指令把这些头文件包含到源文件中。

二、头文件的作用

  2.1 函数声明

        头文件可对函数进行声明,这样在源文件里使用这些函数时,编译器就能知晓函数的参数和返回值类型。例如:在标准库 `<stdio.h>` 中就声明了像 `printf`、`scanf` 这类函数

  2.2 宏定义

        头文件可包含宏定义,这样就能在多个源文件中复用这些宏。

        例如,定义一个表示圆周率的宏:#define PI 3.1415926

  2.3 结构体和共用体定义

        在头文件中定义结构体和共用体,能让多个源文件使用相同的数据类型定义。例如:

typedef struct {int x;int y;
} Point;

   2.4 全局变量声明        

        头文件可对全局变量进行声明,让多个源文件能访问这些变量。不过要注意,头文件里通常只进行声明,变量的定义要放在源文件中。例如:

extern int global_variable;

三、头文件的创建

        创建头文件的步骤如下:

                1. 新建一个文本文件,把扩展名设为 `.h`。

                2. 在文件中添加所需的内容,如函数声明、宏定义等。

                3. 为避免头文件被重复包含,通常要使用预处理器指令来进行保护。

        下面是一个简单头文件的示例,名为 `myheader.h`:

#ifndef MYHEADER_H
#define MYHEADER_H// 函数声明
int add(int a, int b);// 宏定义
#define MAX(a, b) ((a) > (b) ? (a) : (b))// 结构体定义
typedef struct {int width;int height;
} Rectangle;#endif

        在这个例子中,`#ifndef`、`#define` `#endif` 构成了头文件保护机制。`#ifndef MYHEADER_H` 检查 `MYHEADER_H` 这个宏是否未定义,若未定义,就定义该宏并包含头文件内容;若已定义,就跳过这些内容,以此防止头文件被重复包含。

四、头文件的使用

        要在源文件中使用头文件,需用 `#include` 预处理指令把它包含进来。`#include` 有两种形式:

  4.1 `#include <头文件>`

        这种形式用于包含系统提供的头文件,预处理器会在系统指定的标准库目录里查找该头文件。例如:#include <stdio.h>

  4.2 `#include "头文件"`

        这种形式用于包含自定义的头文件,预处理器会先在当前目录查找该头文件,若找不到,再去系统指定目录查找。例如:#include "myheader.h"

下面是一个使用 `myheader.h` 头文件的源文件示例:

#include "myheader.h"
#include <stdio.h>// 函数定义
int add(int a, int b) {return a + b;
}int main() {int result = add(3, 5);printf("3 + 5 = %d\n", result);int max_val = MAX(10, 20);printf("最大值是: %d\n", max_val);Rectangle rect = {10, 20};printf("矩形的宽度: %d, 高度: %d\n", rect.width, rect.height);return 0;
}

五、标准库头文件

        C 标准库头文件(Standard Library Header Files)是由 ANSI C(也称为 C89/C90)和 ISO C(C99 和 C11)标准定义的一组头文件,这些头文件提供了大量的函数、宏和类型定义,用于处理输入输出、字符串操作、数学计算、内存管理等常见的编程任务。

以下是一些常见的 C 标准库头文件及其功能简介:

头文件功能简介
<stdio.h>标准输入输出库,包含 printfscanf 等函数
<stdlib.h>标准库函数,包含内存分配、程序控制等函数
<string.h>字符串操作函数,如 strlenstrcpy 等
<math.h>数学函数库,如 sincossqrt 等
<time.h>时间和日期函数,如 timestrftime 等
<ctype.h>字符处理函数,如 isalphaisdigit 等
<limits.h>定义各种类型的限制值,如 INT_MAX 等
<float.h>定义浮点类型的限制值,如 FLT_MAX 等
<assert.h>断言宏 assert,用于调试检查
<errno.h>定义错误码变量 errno 及相关宏
<stddef.h>定义通用类型和宏,如 size_tNULL 等
<signal.h>处理信号的函数和宏,如 signal 等
<setjmp.h>提供非本地跳转功能的宏和函数
<locale.h>地域化相关的函数和宏,如 setlocale 等

六、注意事项

  6.1 头文件保护

        一定要使用头文件保护机制,防止头文件被重复包含,避免出现重复定义的错误。

  6.2 全局变量声明与定义

        头文件里一般只对全局变量进行声明,变量的定义要放在源文件中,防止出现重复定义的问题。

  6.3 头文件的组织

        要合理组织头文件的内容,让其保持清晰和简洁。避免在头文件中放置过多的实现代码,实现代码应放在源文件中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/903416.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/903416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库day-08

一、实验名称和性质 删除修改数据 验证 设计 二、实验目的 1&#xff0e;掌握数据操作-- 删除、修改&#xff1b; 三、实验的软硬件环境要求 硬件环境要求&#xff1a; PC机&#xff08;单机&#xff09; 使用的软件名称、版本号以及模块&#xff1a; Windows 10&#x…

JAVA中Spring全局异常处理@ControllerAdvice解析

一、ControllerAdvice基础概念 1. 什么是ControllerAdvice&#xff1f; ControllerAdvice是Spring 3.2引入的注解&#xff0c;用于定义全局控制器增强组件&#xff0c;主要功能包括&#xff1a; 全局异常处理&#xff08;最常用&#xff09;全局数据绑定全局数据预处理 2. …

开放平台架构方案- GraphQL 详细解释

GraphQL 详细解释 GraphQL 是一种用于 API 的查询语言&#xff0c;由 Facebook 开发并开源&#xff0c;旨在提供一种更高效、灵活且强大的数据获取和操作方式。它与传统的 REST API 有显著不同&#xff0c;通过类型系统和灵活的查询能力&#xff0c;解决了 REST 中常见的过度获…

labview项目文件架构

为了使 LabVIEW 项目更具可扩展性和易于维护&#xff0c;合理规划和设计项目文件结构是非常重要的。 以下是一些基于行业经验和最佳实践的建议&#xff1a; 1. ### 文件夹层次划分 将不同的功能模块分开存储在一个清晰的分层目录结构中是一个常见的做法。通常情况下&#xff…

Chrome的插件扩展程序安装目录是什么?在哪个文件夹?

目录 前提 直接复制到浏览器中打开 Mac下Chrome extension 安装路径 最近换了mac pro用起来虽然方便&#xff0c;但是对常用的一些使用方法还是不熟悉。这不为了找到mac上chrome插件的安装路径在哪里&#xff0c;花费了不少时间。我想应用有不少像小编一样刚刚使用mac的小白…

第13讲:图形尺寸与分辨率设置——适配论文版面,打造专业图稿!

目录 📌 为什么这一讲重要? 🎯 一、先认识几个关键词 ✍️ 二、ggsave() 是导出图的标准方法 📐 三、尺寸设置技巧:对齐目标期刊 🔍 找到目标期刊的图形栏宽 📦 四、多个图组合导出(与 patchwork 搭配) 🧪 五、使用 Cairo / ragg 导出高质量图 🎁 六…

2025年- H13-Lc120-189.轮转数组(普通数组)---java版

1.题目描述 2.思路 import java.util.Arrays;public class H189 {public static void main(String[] args) {int[] newArr {1, 2, 3, 4, 5};int[] nums new int[5];System.arraycopy(newArr,0,nums,0,4);System.out.println(Arrays.toString(nums)); } }补充2&#xff1a; 3.…

机器人--相机

教程 畸变和校正 单目和双目标定 单双&#xff0c;rgb-d原理 单目相机 只有一个摄像头的相机。 原理 小孔成像。 缺点 单目相机无法测量物体点的深度信。 因为物体的Z轴坐标系无法测量。 双目相机 有两个摄像头的相机。 用两个单目相机组成的双目相机就可以测量深度信…

Go 语言入门:(一) 环境安装

一、前言 这里不同于其他人的 Go 语言入门&#xff0c;环境安装我向来注重配置&#xff0c;比如依赖包、缓存的默认目录。因为前期不弄好&#xff0c;后面要整理又影响这影响那的&#xff0c;所以就干脆写成文章&#xff0c;方便后期捡起。 二、安装 1. 安装包 https://go.…

笔试专题(十二)

文章目录 主持人调度题解代码 小红的ABC题解代码 不相邻取数题解代码 空调遥控题解代码 主持人调度 题目链接 题解 1. 排序 2. 先按左端点的大小进行排序&#xff0c;保证时间是连续的&#xff0c;如果后一个点的左端点大于等于前一个点的右端点就是和法的&#xff0c;否则…

Ansible 守护 Windows 安全(Ansible Safeguards Windows Security)

Ansible 守护 Windows 安全&#xff1a;自动化基线检查与加固 在当今网络威胁日益严峻的形势下&#xff0c;保障 Windows 系统安全至关重要。Ansible 作为一款强大的自动化运维工具&#xff0c;可通过自动化脚本实现 Windows 安全基线检查和加固&#xff0c;大幅提升运维效率并…

深度解析 MyBatis`@TableField(typeHandler = JacksonTypeHandler.class)`:优雅处理复杂数据存储

一、引言&#xff1a;当Java对象遇见数据库 在现代应用开发中&#xff0c;我们经常面临一个关键问题&#xff1a;如何将复杂的Java对象&#xff08;如Map、List或自定义POJO&#xff09;优雅地存储到关系型数据库中&#xff1f;传统解决方案需要开发者手动进行序列化和反序列化…

【无标题】四色定理研究团队的构建与实施路径——跨学科建模、编程与理论拓展的全流程方案

### **四色定理研究团队的构建与实施路径** **——跨学科建模、编程与理论拓展的全流程方案** --- #### **一、团队构建与核心分工** ##### **1.1 核心角色与技能需求** | **角色** | **职责** | **技能要求** …

SQLMesh增量模型实战指南:时间范围分区

引言 在数据工程领域&#xff0c;处理大规模数据集和高频率数据更新是一项挑战。SQLMesh作为一款强大的数据编排工具&#xff0c;提供了增量模型功能&#xff0c;帮助数据工程师高效地管理和更新数据。本文将详细介绍如何使用SQLMesh创建和管理基于时间范围的增量模型&#xf…

TCP vs UDP:核心区别、握手过程与应用场景(附对比图)

&#x1f310; 引言 在网络通信中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;是两大核心传输层协议。它们各有优劣&#xff0c;适用于不同场景。本文将用图文对比实战示例&#xff0c;帮你彻底理解两者的区别&#xff0…

STM32F103C8T6信息

STM32F103C8T6 完整参数列表 一、核心参数 内核架构‌ ARM Cortex-M3 32位RISC处理器 最大主频&#xff1a;72 MHz&#xff08;基于APB总线时钟&#xff09; 运算性能&#xff1a;1.25 DMIPS/MHz&#xff08;Dhrystone 2.1基准&#xff09; 总线与存储‌ 总线宽度&#xff…

WPF-遵循MVVM框架创建图表的显示【保姆级】

文章速览 1、技术栈实现步骤1、创建WPF工程项目2、引入框架 Caliburn.Micro、数据可视化库ScottPlot.WPF3、创建文件夹&#xff0c;并创建相应的View & ViewModel4、创建启动类5、将启动类设置为启动项6、编写View7、编写VM8、将VM和View中的图表进行绑定9、备注 示例效果 …

kafka理论学习汇总

基础知识 基本简介 Kafka 是一个分布式流式处理平台&#xff0c;是一种分布式的&#xff0c;基于发布/订阅的消息系统。 Kafka特点&#xff1a; 1. 同时为发布和订阅提供高吞吐量 Kafka 的设计目标是以时间复杂度为 O(1) 的方式提供消息持久化能力&#xff0c;即使对 TB 级以…

【亚马逊云】AWS Wavelength 从理论讲解到实验演练

&#x1faaa; 本文作者&#xff1a;许业宝 ✍️ 作者信息&#xff1a; &#x1f31e; VSTECS 云解决方案架构师 &#xff5c; AWS Ambassador &#xff5c; &#x1faaa; AWS Community Builder | 亚马逊云科技技能云博主 ⭐ 已获六项 AWS 认证 | CKA、CKS认证 &#xff5c; …

ORACLE DATAGUARD遇到GAP增量恢复方式修复RAC环境备机的实践

ORACLE DATAGUARD技术是一个常用的数据保护机制&#xff0c;在DATAGUARD运行过程中&#xff0c;遇到异常导致备机不同步&#xff0c;而主库的归档日志也被清理&#xff0c;此时出现GAP&#xff0c;无法同步&#xff1b;就需要人工处理&#xff1b;对于小型数据库重新全量同步数…