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

ops/2024/9/22 16:51:53/

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

相关文章

Json 反序列化错误

Json 反序列化错误 JsonReaderException: Unexpected character encountered while parsing value: . Path ‘’, l 可能是因为字符串是BOM UTF-8格式,需要把BOM去掉 public byte[] RemoveBOMData(byte[] bytesWithBom) {// UTF-8 BOM的字节表示&#…

大数据技术概述_4.大数据的应用领域

1.制造业的应用 制造业目前正在向信息化和自动化的方向发展。在产品的设计、生产和销售中,越来越多的企业使用计算机辅助设计(CAD)、计算机辅助制造(CAM)等软件,数控机床、传感器等设备,物料需求…

微积分 --- 偏导数,方向导数与梯度(二)

方向导数 上图为一温度图,所反映的是加利福利亚洲和内华达州在十月的一天下午三点的温度。其中,图中的每一点都是温度T关于x,y的函数,即T(x,y)。对于图中的Reno市而言,沿着x方向的偏导反映的是温度沿着x方向,即沿着东方…

已解决javax.sound.sampled.LineUnavailableException异常的正确解决方法,亲测有效!!!

已解决javax.sound.sampled.LineUnavailableException异常的正确解决方法,亲测有效!!! 目录 问题分析 出现问题的场景 报错原因 解决思路 解决方法 检查音频设备是否被其他应用占用 确认音频格式设置 更新或重装音频驱动…

Java面试题:JMM内存模型

JMM(java内存模型) Java Memory Model 定义了共享内存中多线程程序读写操作的行为规范,通过这些规则来规范内存对读写的操作从而保证指令的正确性. JMM内存 分为两块:工作内存和主内存 工作内存 每个线程在创建时都会分配一个工作内存,用以存储线程的私有数据,每个线程只…

Jmeter性能测试(二)

Jmeter脚本调试 1、添加线程组 鼠标放在测试计划上单击一下,然后右键菜单就出来了 2、添加http请求 鼠标放在线程组上单击一下,然后右键菜单就出来了 3、添加全局变量 鼠标放在线程组上单击一下,然后右键菜单就出来了 4、使用全局…

AI论文速读 |2024[IJCAI]TrajCL: 稳健轨迹表示:通过因果学习隔离环境混杂因素

题目: Towards Robust Trajectory Representations: Isolating Environmental Confounders with Causal Learning 作者:Kang Luo, Yuanshao Zhu, Wei Chen, Kun Wang(王琨), Zhengyang Zhou(周正阳), Sijie Ruan(阮思捷), Yuxuan Liang(梁宇轩) 机构&a…

Terraform代码重载文件

一般来说Terraform会加载模块内所有的.tf和.tf.json文件,并要求文件内定义了一组无重复的对象。如果两个文件尝试定义同一个对象,那么Terraform会报错。 在某些少见场景中,能够用单独的文件重载已有对象配置的特定部分将会十分有用。比如说&a…