【Keil】预处理指令#ifndef、#define 和 #endif

当时就是因为两个.h文件的预处理指令内容相同,导致其中一个.h文件的声明一直无效!!

在 C 或 C++ 编程中,您看到的这两行代码是一种常见的头文件保护机制,用于防止头文件被多重包含(include multiple times)。这种情况可能发生在以下情况:

  1. 头文件自身引用自身:例如,一个头文件直接或间接地包含了它自己。
  2. 多个头文件相互引用:形成循环引用,文件 A 包含文件 B,文件 B 又包含文件 A。

当一个头文件被多重包含时,会导致同一个变量或函数被重复定义,这在 C 或 C++ 中是不允许的,会导致编译错误。

为了解决这个问题,程序员使用预处理指令 #ifndef#define#endif 来确保头文件只被包含一次。以下是这些指令的解释:

#ifndef __INS_DATA_SWITCH_H   // 如果没有定义 __INS_DATA_SWITCH_H
#define __INS_DATA_SWITCH_H   // 则定义 __INS_DATA_SWITCH_H
// 头文件的内容
#endif                     // 结束条件检查
  • #ifndef __INS_DATA_SWITCH_H:检查是否定义了 __INS_DATA_SWITCH_H。如果没有定义,编译器将继续处理下面的代码。
  • #define __INS_DATA_SWITCH_H:定义 __INS_DATA_SWITCH_H 为一个宏。如果头文件被多重包含,这个宏已经定义了,预处理器将跳过这个头文件的所有内容。
  • #endif:标记检查的结束。

使用这种机制,无论头文件被包含多少次,头文件的内容只会被编译一次,从而避免了多重定义的问题。

此外,宏定义通常使用独特的标识符,如 __INS_DATA_SWITCH_H,以确保它们不会与系统中的其他宏冲突。在 STM32 和其他嵌入式项目中,这是一个很好的实践,可以保持代码的清洁和避免潜在的编译错误。

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

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

相关文章

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层:Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取,支持 InnoDB、MyISAM、Memory 等多个存储引擎,MySQL5.5以后默认使用InnoDB&#xff0…

Nacos、OpenFeign、网关 笔记

一、远程调用 1.1配置RestTemplate配置类 package com.hmall.cart.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate;Configuration public c…

【06016传感器原理与应用】第3章 力学量传感器 期末复习自考复习

第3章 力学量传感器 定义:将力/压力等力学量信号变成电信号的装置 称为力学量传感器。 力学传感器的分类: 应用普遍的:电阻式、压电式、电容式、电感式、谐振式、变磁阻式、光纤式等等。传统的如弹簧:成本低、不需电源&#xff…

Docker-compose的介绍与用法

Docker-compose Docker Compose 是一个开源的容器编排工具,由 Docker 官方开发。它允许开发者定义一个或多个 Docker 容器作为单个服务,并将这些服务组合成一个项目。这些定义被保存在一个 YAML 文件中,称为 docker-compose.yml。 使用 Dock…

C#命名空间常用函数

在C#中,不同命名空间下有各种常用函数,下面列举一些常见的函数及其对应的命名空间: System命名空间: Console.WriteLine():用于向控制台输出信息。Convert.ToInt32():用于将其他数据类型转换为整数类型。 S…

uniapp+axios请求的封装

uniappaxios请求的封装 因在用vue3.0时会导致无法引有buildFullPath和settle两个库。所简单处理这两个方法 // utils/request.ts文件代码如下 /***uniappaxios请求的封装 **/import axios from axios import $config from "/config/config" import {getToken,remo…

个人图床解决方案(PicGo+对象存储, 几乎免费)

个人图床解决方案(PicGo对象存储) 原先我的解决方案是github做图床,套一层Cloudflare的cdn来加速国内访问, 但国内访问仍然过慢, 特别是一些图很多的文章, 加载非常慢. 所以我想着改善一下, 在对比了一些解决方案之后, 我选择了PicGo缤纷云搭建主图床, 部分图片放在 去不图床,…

php扩展

查看扩展: print_r(get_loaded_extensions());判断扩展: if (!extension_loaded(gd)) {if (!dl

在STM32上实现嵌入式人工智能应用

引言 随着微控制器的计算能力不断增强,人工智能(AI)开始在嵌入式系统中扮演越来越重要的角色。STM32微控制器由于其高性能和低功耗的特性,非常适合部署轻量级AI模型。 本文将探讨如何在STM32平台上实现深度学习应用,…

JAVA:maven-->>检查 所有依赖 与 环境 兼容

内容 为了确保你项目中的所有依赖都彼此兼容,并与你的环境相适应,你可以利用 Maven 的依赖管理功能。Maven 有助于解决、升级,并对齐所有库的版本,以避免任何不一致或冲突。以下是检查兼容性的步骤: ### 检查兼容性的…

图计算浅谈:主流图存储引擎/图搜索算法

在数据关联与复杂网络越来越突显其价值的今日,图数据库(Graph Database)逐渐成为在大数据领域不可或缺的一部分。图数据库强调数据项之间的关系,它不仅能存储大量的顶点(Vertex)和边(Edge&#…

Elasticsearch 索引的分片和副本是什么意思,如何扩展分片

文章目录 前言Elasticsearch 索引的分片和副本是什么意思,如何扩展分片示例:1. 设置 5个分片,每个分片一个副本的命令2. 将5个分片扩展到10个分片 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊&…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求,并且请求同…

Qt下使用7Z源码进行压缩和解压缩

7Z压缩是一款常用的压缩算法和工具,本文主要介绍一款在qt环境下进行编译的压缩方法。 本人测试是可以正常跑通的,具体代码部分请下载:下载链接,提取码:ev9t 7z源码网址:7-Zip 7z简介: 7z 是…

Python多线程并不是真的并行执行

Python多线程虽然能够利用多个CPU核执行计算,但并不能真正执行多线程并行计算。因为在Python中,有一个全局解释锁(GlobalInterpreter Lock,GIL),该锁的存在使得在同一个时间只有一个线程执行任务&#xff0…

rocketmq dashboard控制台中topic状态无法展示

现象 在使用rocketmq控制台查看topic状态和订阅状态时,出现错误和没有信息的情况。 原因 rocketmq控制台版本问题,最新版本为1.0.1,支持rocketmq5版本,如果使用rocketmq4版本的服务无法兼容对应的数据。同理1.0.0版本也无法兼容ro…

Spark AQE 导致的 Driver OOM问题

背景 最近在做Spark 3.1 升级 Spark 3.5的过程中,遇到了一批SQL在运行的过程中 Driver OOM的情况,排查到是AQE开启导致的问题,再次分析记录一下,顺便了解一下Spark中指标的事件处理情况 结论 SQLAppStatusListener 类在内存中存…

Hadoop之路---伪分布式环境搭建

hadoop更适合在liunx环境下运行,会节省后期很多麻烦,而用虚拟器就太占主机内存了,因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 (windows上如何安装wsl) 千万强调,创建完hado…

20240427-线程基础-结束线程

线程基础-结束线程 1.stop()方法 略 2.使用共享变量 package com.ysf.day0427;public class Tst03ShareVar {static volatile boolean flag true;public static void main(String[] args) throws InterruptedException {Thread t new Thread(()->{while (flag){//处理…

读天才与算法:人脑与AI的数学思维笔记14_人脑的极限

1. 数学研究 1.1. 数学研究变得更为艰难了 1.1.1. 学科分支越发密集,问题越发复杂 1.1.2. 攻读博士学位的3年时间,只够去理解导师所给题目的含义 1.1.3. 随后,再花费数年时间去研究、探索,运气不错的话,会得到一些…