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

当你在编写一个头文件(例如 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.hqwc.cn/news/671037.html

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

相关文章

Unity类银河恶魔城学习记录 17-1,2 p166 Aliments fx p167 Blackhole additional vfx

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; …

【爬虫】爬取A股数据写入数据库(一)

1. 对东方财富官网的分析 步骤: 通过刷新网页,点击等操作,我们发现https://datacenter-web.eastmoney.com/api/data/v1/get?请求后面带着一些参数即可以获取到相应数据。我们使用python来模拟这个请求即可。 我们以如下选择的页面为切入点…

open 函数到底做了什么

使用设备之前我们通常都需要调用 open 函数,这个函数一般用于设备专有数据的初始化,申请相关资源及进行设备的初始化等工作,对于简单的设备而言,open 函数可以不做具体的工作,你在应用层通过系统调用 open 打开设备…

基于深度学习检测恶意流量识别框架(80+特征/99%识别率)

基于深度学习检测恶意流量识别框架 目录 基于深度学习检测恶意流量识别框架简要示例a.检测攻击类别b.模型训练结果输出参数c.前端检测页面d.前端训练界面e.前端审计界面(后续更新了)f.前端自学习界面(自学习模式转换)f1.自学习模式…

Python安装以及环境配置

目录 一、下载安装包二级目录三级目录 一、下载安装包 方式网址Python官网python.org镜像下载地址Download pythonpycharmDownload PyCharm https://blog.csdn.net/sun80760/article/details/135256627 二级目录 三级目录

C#连接S7-200 smart通讯测试

honeytree 一、编程环境 VS2022软件,选择windows窗体应用(.NET FrameWork):​博途TIA/WINCC社区VX群 ​博途TIA/WINCC社区VX群 添加NuGet程序包;S7netplus 二、引用http://S7.net 三、建立PLC链接 S7-200smart和…

Window如何运行sh文件以及wget指令

Git下载 官网链接如下:https://gitforwindows.org/ 安装就保持一路无脑安装就行,不需要改变安装过程中的任何一个选项。 配置Git 切刀桌面,随便右击屏幕空白处,点open Git Bash here 把这行复制过去,回车&#xff1…

Linux第三节--常见的指令介绍集合(持续更新中)

点赞关注不迷路!,本节涉及初识Linux第三节,主要为常见的几条指令介绍。 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 ✨ 加关注👀 期待与你共同进步! Linux下基本指令 1. man指令 Linu…

io (fscanf fprintf)

20 #include <sys/un.h>21 typedef struct stu22 {23 char name[16];24 int age;25 double score;26 }stu;27 int main(int argc, const char *argv[])28 {29 /* 有如下结构体30 31 申请该结构体数组&#xff0c;容量为5&#xff0c;初始化5个学生的信息32 …

Flink窗口理论到实践 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

奶爸预备 |《P.E.T.父母效能训练:让亲子沟通如此高效而简单:21世纪版》 / 托马斯·戈登——读书笔记

目录 引出致中国读者译序前言第1章 父母总是被指责&#xff0c;而非受训练第2章 父母是人&#xff0c;不是神第3章 如何听&#xff0c;孩子才会说&#xff1a;接纳性语言第4章 让积极倾听发挥作用第5章 如何倾听不会说话的婴幼儿第6章 如何听&#xff0c;孩子才肯听第8章 通过改…

光端机(2)——光纤通信学习笔记九

学习笔记里面只关注基本原理和概念&#xff0c;复杂的公式和推导都没有涉及 光端机 光发射机 作用&#xff1a;实现电光转换。将来自电端机的电信号对光源发出的光波进行调制&#xff0c;然后将调制好的光信号耦合到光线中传输。 基本性能要求 1.合适的发光波长&#xff08;光…