笔记86:关于【#ifndef + #define + #endif】的用法

embedded/2024/10/19 7:36:54/

当你在编写一个头文件(例如 pid_controller.h)时,你可能会在多个源文件中包含它,以便在这些源文件中使用该头文件定义的函数、类或其他声明。如果你在多个源文件中都包含了同一个头文件,那么当你将整个工程统一编译,希望链接成一个完整的可执行文件时,就会出现大量错误,因为每一个相同的头文件都会进行所谓的“重定义”,导致重复定义的错误。

但是如果加上了上面这三句代码,就不会出现重复定义的错误了:

#ifndef PID_CONTROLER_H
#define PID_CONTROLER_H//在这里写pid_controler.h所需要的具体内容#endif

作用:

  • #ifndef:检查是否定义了宏PID_CONTROLER_H,如果未定义,那么从#define开始一句句的执行下面的代码块;如果已定义,说明之前已经包含过这个头文件,那么就跳过这个代码块,即直接跳到#endif后面,避免重复定义
  • #define:定义了宏 PID_CONTROLER_H,这样在当前编译单元中就有了一个标记,表示这个头文件已经被包含过了
  • 在#define和#ifndef之间,你可以放置头文件的内容,包括函数声明、类声明等

  • #endif:表示条件编译的结束

因此,当你在其他源文件中包含 pid_controller.h 时,预处理器会首先检查是否已经包含过该头文件。如果之前已经包含过,那么就不会再次包含,这样就避免了重复定义的问题。


注意1:

我们在使用define关键字时经常是这样的:

#define MAX_SIZE 100

MAX_SIZE 是一个宏名,它被定义成一个常量值 100,这意味着,在后续的代码中,每当出现 MAX_SIZE 这个名字,预处理器会将其替换为 100;

但如果是这样的:

#define MAX_SIZE

#define 后面没有跟着一个具体的值时,它实际上是定义了一个宏,但它并没有给这个宏赋予一个特定的值。在这种情况下,它通常用于条件编译,起到一个开关的作用。就是我们介绍的【#ifndef + #define + #endif】所实现的作用;


注意2:

一般我们每个头文件要定义的宏是不能一样的,因此我们在定义的时候,通常使用头文件的名称作为宏,例如:

我的头文件名为pid_controler.h,所以这个头文件所使用的宏被命名为_PID_CONTROLER_H;


http://www.ppmy.cn/embedded/35448.html

相关文章

如何在 Windows 11 上检查和显示 CPU 温度

1.为什么需要监控 CPU 温度? CPU 是您计算机的核心,是从后台运行整个节目的木偶大师,接收指令并处理保持整个 shindig 运行所需的处理能力。并且需要定期监测其内部温度,以确保节目不会着火。高于平均水平的热量总是会导致性能急…

每日OJ题_贪心算法二⑤_力扣870. 优势洗牌(田忌赛马)

目录 力扣870. 优势洗牌(田忌赛马) 解析代码 力扣870. 优势洗牌(田忌赛马) 870. 优势洗牌 难度 中等 给定两个长度相等的数组 nums1 和 nums2,nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引…

游戏辅助 -- 某游戏一键端配置

游戏一键端下载地址及安装视频: https://pan.quark.cn/s/e6a373d94707 ​https://pan.quark.cn/s/ef7ab0c48776 准备工作 Vmware虚拟机软件:用于创建和管理虚拟机。 SecureCRT:一款支持SSH的终端仿真程序,用于远程登陆服务器…

MySQL的Checkpoint创建时机

MySQL的Checkpoint是InnoDB存储引擎用来确保数据完整性和高效恢复的一个机制。Checkpoint发生时,InnoDB会将内存中的脏页(即已经被修改但尚未写入磁盘的数据页)写入磁盘。这个过程对于减少数据库崩溃恢复时间和确保数据一致性至关重要。 Che…

智能Agent:未来社会的角色、发展路径与挑战

​​​​​​​ 随着人工智能技术的不断发展,智能Agent已经成为了我们生活中越来越重要的一部分。从智能助手到自动驾驶汽车,再到语音助手和智能家居系统,智能Agent正在以多种形式渗透到我们的日常生活中。但随着Agent AI的智能化水平不断提…

【网心云邀请码:KpyV3Dk7】轻松赚油费,新用户专享福利来袭!绑定设备连续在线7 天必得高额奖励

📢 各位朋友们,好消息来啦!现在注册网心云,通过我们的专属邀请码:KpyV3Dk7 ,即可享受多重新手福利,让您的闲置设备为您赚钱! 💸 立即加入,您将获得&#xff1…

双重检验锁方式实现单例模式

单例模式(Singleton Pattern):是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象&#xff0c…

若依分离版-前端使用echarts组件

1 npm list:显示已安装的模块 该命令用于列出当前项目的所有依赖关系,包括直接依赖和间接依赖。执行 npm list 时,npm 将从当前目录开始,递归地列出所有已安装的模块及其版本信息 npm list 2 npm outdated:用于检查当前项目中的npm包是否有…