【头文件】对.h文件的理解

目录

🌞1. 头文件的概念

🌊1.1 头文件的由来

🌊1.2 头文件的作用

🌊1.3 在.h文件中实现函数也不会出错的原因

🌞2. 简单示例

🌊2.1 头文件addition.h

🌊2.2 头文件接口实现addition.cpp

🌊2.3 源文件


🌞1. 头文件的概念

🌊1.1 头文件的由来

在编译器只认识.c(.cpp)文件的年代,人们发现很多.c(.cpp)文件中的声明语句是相同的,但需要重复地敲入每个文件中,导致维护困难。为了解决这个问题,人们将重复的部分提取出来放在一个新文件中,即“头文件”,通常使用.h扩展名。这些头文件包含了变量和函数的全局性声明,被其他.c文件共享,方便修改和维护大型代码。因此,头文件中通常只包含声明而很少包含具体实现的代码。


🌊1.2 头文件的作用

头文件(通常以.h为扩展名)是用来声明变量、函数、宏等的文件,它通常包含在源代码文件中,用于向编译器提供关于程序中各种元素的信息。下面是关于头文件的一些常见理解:

  1. 声明和定义的分离:头文件包含了各种声明,如函数原型、变量声明、宏定义等,而对应的定义通常在其他的源代码文件中。这样做的好处是可以在程序中分离接口和实现,使得代码更具有模块化和可维护性。

  2. 共享代码:头文件可以被多个源代码文件引用,这样就可以在多个文件之间共享函数、变量等信息,避免了重复编写相同的代码,提高了代码的重用性。

  3. 编译优化:使用头文件可以让编译器在编译时对代码进行更好的优化,因为编译器可以在编译单个源文件时了解到所有需要的函数原型和变量声明,从而做出更好的优化决策。

  4. 可读性和维护性:头文件可以作为接口文档,向其他开发者传达关于函数、变量等的信息,提高了代码的可读性和可维护性。通过查看头文件,开发者可以快速了解程序的接口和结构。

  5. 预处理指令:头文件中通常包含预处理指令,如条件编译、宏定义等,用于控制代码的编译行为,实现跨平台兼容性、调试信息开关等功能。

总的来说,头文件在C/C++编程中扮演着非常重要的角色,它们不仅定义了程序的接口,还能提高代码的重用性、可读性和可维护性,是模块化编程的重要组成部分。


🌊1.3 在.h文件中实现函数也不会出错的原因

要解决上述问题,首先必须弄清编译器的工作原理。编译器的最终目的是将程序员编写的源代码转换成机器能够识别运行的二进制机器码

大体可分成 4 个步骤:

  1. 头文件的预编译,预处理
    编译器在编译源代码时,会先编译头文件,保证每个头文件只被编译一次。
    在预处理阶段,编译器将c文件中引用的头文件中的内容全部写到c文件中。
  2. 词法和语法分析(查错)
  3. 编译(汇编代码)
    转化为汇编码,这种文件称为目标文件。后缀为.obj。
  4. 链接(二进制机器码)
    将汇编代码转换为机器码,生成可执行文件。后缀为.exe。

在.h文件中实现函数不会出错的原因是因为.h文件的内容在预处理阶段被直接包含到调用它的源文件中,而在编译阶段,编译器只关注源文件的内容,而不关心它是如何被包含的。因此,将函数的实现放在.h文件中并不会导致编译错误。

然而,这种做法并不是推荐的编程习惯。通常,头文件应该只包含函数的声明和数据结构的定义,而不应该包含函数的实现。


🌞2. 简单示例

🌊2.1 头文件addition.h

addition.h内容如下:

#ifndef ADDITION_H
#define ADDITION_H

// 函数声明
int add(int a, int b);

#endif /* ADDITION_H */

补充:

头文件为什么喜欢写类似下面的内容:

#ifndef ADDITION_H 
#define ADDITION_H 

//内容。。。

#endif

这是头文件中常见的一种写法,被称为"头文件保护(Header Guard)"或"防止重复包含(Include Guard)"。它的作用是防止同一个头文件被多次包含导致的重定义错误。

  1. #ifndef ADDITION_H: 这是一个预处理器指令,意为 "if not defined",即如果宏 ADDITION_H 没有被定义过,则执行下面的代码。这里 ADDITION_H 是一个自定义的宏名称,通常会取和头文件名相关的名字。

  2. #define ADDITION_H: 这是另一个预处理器指令,用来定义宏 ADDITION_H。这样,当 ADDITION_H 被定义后,#ifndef ADDITION_H 就会失败,后面的代码将不会被包含。

  3. #endif: 这是一个预处理器指令,用来结束条件编译块。它表示着条件编译的结束。

这种写法的目的在于,当头文件被包含多次时,只有第一次包含时会真正将文件内容包含进去,后续的包含则会被预处理器忽略,从而避免了重定义错误。

这样的预处理器指令在大型项目中尤其有用,因为一个头文件可能会被多个源文件包含,如果没有适当的保护措施,就会导致重定义错误。


🌊2.2 头文件接口实现addition.cpp

addition.cpp内容如下:

#include "addition.h"

// 函数实现
int add(int a, int b) {
    return a + b;
}

通常头文件对应接口的实现命名与头文件类似,比如addition.cpp是头文件addition.h的接口实现。


🌊2.3 源文件

源文件调用头文件addition.h

#include <stdio.h>
#include "addition.h" // 包含头文件

int main() {
    int result = add(5, 3); // 调用add函数
    printf("Result: %d\n", result);
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode 119 杨辉三角 II

目录 一、问题描述二、示例及约束三、代码方法一&#xff1a;递推方法二&#xff1a;线性递推 四、总结 一、问题描述 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。   在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。   自我…

【JavaEE网络】深入理解Socket套接字及其在网络编程中的应用

目录 Socket套接字UDP VS TCP有连接 VS 无连接可靠传输 VS 不可靠传输面向字节流 VS 面向数据报 全双工 VS 半双工 UDP数据报套接字编程DatagramSocket APIDatagramPacket APIInetSocketAddress APIUDP回显客户端服务器服务器和客户端的工作流程UDP翻译客户端服务器 Socket套接…

轻松找回误删文件,告别企业数据丢失,如何有效利用teamOS二级回收站,提升数据管理效率

在数字化时代&#xff0c;我们越来越依赖电子文件来记录和管理重要信息。 然而&#xff0c;伴随着这种便利的同时&#xff0c;误删或恶意操作导致的文件丢失也成为了一个令人头疼的问题。 那么本文就来谈一谈&#xff0c;企业网盘如何解决误删、甚至恶意删除的问题。 可道云…

高效的数据采集如何促进企业发展?

大数据开启了一个大规模生产、分享和应用数据的时代&#xff0c;它给技术和商业带来了巨大的变化。麦肯锡研究表明&#xff0c;在医疗、零售和制造业领域&#xff0c;大数据每年可以提高劳动生产率0.5-1个百分点。大数据在核心领域的渗透速度有目共睹&#xff0c;然而调查显示&…

ctfshow——XSS

文章目录 XSS介绍什么是xss&#xff1f;XSS危害XSS的分类常用XSSpayload web316——反射型XSSweb317——过滤<script> web318——过滤script、imgweb319——不止过滤script、imgweb320——过滤空格web321——不止过滤空格web322——不止过滤空格web323web324web 325web32…

ubuntu下安装python模块 pip intall xxx报错

报错内容大概如下&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f0fc68d6370>: Failed to establ…

Python 基础、流程、容器、函数

一、基础语法 1.1 前言 1.1.1 Python简介 Python是一门编程语言&#xff0c;Python的作者是Guido van Rossum&#xff08;龟叔&#xff09; Python优点&#xff1a;简单易学 Python与嵌入式、集成电路行业 强大的库和工具生态系统&#xff1a;Python拥有广泛而强大的库和…

javaWeb项目-社区医院管理服务系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java技术 Java语…

什么是全局特征,什么又是局部特征

全局特征和局部特征是用来描述数据中信息的两种不同方式&#xff0c;特别是在图像处理、模式识别和机器学习领域中经常被提到。它们有助于理解和分析数据的不同层面&#xff1a; 全局特征&#xff08;Global Features&#xff09; 全局特征描述了整个数据集的整体属性。在图像…

布局香港之零售小店篇 | 香港一人小企与连锁超市的竞争

近年来&#xff0c;内地品牌入驻香港市场开拓业务已成大势所趋。香港特区政府早前公布的「2023年有香港境外母公司的驻港公司按年统计调查」显示&#xff0c;2023年母公司在海外及内地的驻港公司数量高达9039家。内地品牌在香港的成功落地&#xff0c;不仅为香港市民带来了丰富…

杰理695的UI模式LED灯控制

UI模式LED灯修改每个模式对应的LED灯闪烁修改在ui_normal_status_deal(u8 *status, u8 *power_status, u8 ui_mg_para)

质量精美的UI设计素材库:3000+图标设计资源免费下载!

作为一名设计师&#xff0c;你的设计灵感来自哪里&#xff1f;想象一下吗&#xff1f;事实上&#xff0c;材料库仍然是大多数设计师必不可少的东西&#xff0c;如果你能更方便地找到他们可用的设计材料&#xff0c;那么在创作中&#xff0c;无疑可以用一半的努力得到两倍的结果…

【技巧】Git 版本控制工具没有图标提示怎么办?

Git 版本控制工具在日常开发中使用率是非常高的&#xff0c;多数情况下会安装 TortoiseGit 之类的插件&#xff0c;让文件夹显示图标&#xff0c;方便观察文件的状态。但是有时装完插件之后发现&#xff0c;文件夹/文件并没有图标显示&#xff0c;可以按照以下思路进行排查&…

TCP三次握手详解

目录 什么是TCP TCP头格式组成 三次握手 第一次握手 第二次握手 第三次握手 三次握手的好处 为什么需要三次握手&#xff1f; 什么是TCP 传输控制协议(TCP)是Internet一个重要的传输层协议。TCP提供面向连接、可靠、有序、字节流传输服务。 面向连接&#xff1a; 应用…

AI时代的GPU集群网络算力分析

浅谈GPU集群网络、集群规模和集群算力 引言在生成式AI&#xff08;GenAI&#xff09;和大模型时代&#xff0c;不仅需要关注单个GPU卡的算力&#xff0c;更要关注GPU集群的总有效算力。单个GPU卡的有效算力可以通过该卡的峰值算力来测算&#xff0c;例如&#xff0c;对于Nvidia…

力扣HOT100 - 98. 验证二叉搜索树

解题思路&#xff1a; class Solution {public boolean isValidBST(TreeNode root) {return recur(root,Long.MIN_VALUE,Long.MAX_VALUE);}public boolean recur(TreeNode root,long lower,long upper){if(rootnull) return true;if(root.val<lower||root.val>upper) re…

Linux系统-服务器硬件及RAID配置

目录 一.服务器 1.服务器与普通计算机的区别 2.功能 3.分类&#xff08;按照产品形态分&#xff09; 4.架构&#xff08;按照指令集类型&#xff09; 5.相关指令 5.1.查看服务器CPU的信息 5.2.查看服务器内存的信息 二.RAID磁盘阵列&#xff08;Redundant Array …

C++ 二叉搜索树

文章目录 二叉搜索树的概念二叉搜索树的性质二叉搜索树的模拟实现封装框架添加操作查找操作删除操作 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都…

编程基础“四大件”

基础四大件包括&#xff1a;数据结构和算法,计算机网络,操作系统,设计模式 这跟学什么编程语言,后续从事什么编程方向均无关&#xff0c;只要做编程开发&#xff0c;这四个计算机基础就无法避开。可以这么说&#xff0c;这基础四大件真的比编程语言重要&#xff01;&#xff0…

【打工日常】云原生之使用Docker部署开源云笔记工具Leanote

一、Leanote蚂蚁笔记介绍 1.Leanote简介 Leanote 蚂蚁笔记是一款国产开源的私有云笔记工具。它支持普通格式笔记、Markdown语法、专业数学公式编辑、和思维导图&#xff0c;并且支持vim&emacs等编辑模式。 2.Leanote功能 拥有Markdown 语法支持、无干扰写作模式、Vim和Ema…