#pragma once和#ifndef,#define,#endif

2023-11-01

#pragma once和#ifndef,#define,#endif都有防止头文件重复包含的作用。

所谓重复包含就是指在源文件中头文件被重复使用了同一个头文件(类似二次定义),造成冗余。

1. 程序员想出了利用#ifndef,#define,#endif防止重复包含

     //a.h
     #ifndef A_H
     #define A_H
     function1();
     function2();
     #endif A_H
     //b.h
     #include"a.h"
     #ifndef B_H
     #define B_H
     function3();
     function4();
     #endif B_H
     //main.app
     #include"a.h"
     #include"b.h"
     int main()
     {
         function1();
         function3();
         return 0;
     }
 上述代码经过预处理(把头文件包含到源程序)后,得到如下语句:
     #ifndef A_H
     #define A_H
     function1();
     function2();
     #endif A_H

     #ifndef A_H
     #define A_H
     function1();
     function2();
     #endif A_H
     #ifndef B_H
     #define B_H
     function3();
     function4();
     #endif B_H

     int main()
     {
         function1();
         function3();
         return 0;
     }
 显然由于第二个的#ifndef A_H的条件不成立,所以就避免了a.h
 头文件的重复包含。

但是这种方法也存在的明显的弊端:
其一,#ifndef的宏名要注意不能再次使用;其二,每次重复都要来判断,显然效率低下

2.随后出现了#pragma once解决了上述问题

     //a.h
     #pragma once
     function1();
     function2();

但#pragma once也非十全十美,一些较老的编译器并不支持。

1
2
3

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#pragma once和#ifndef,#define,#endif 的相关文章

  • 十分钟学会写shell脚本

    大家好 我是handsomecui 下面我为大家讲解一下shell脚本的写法 讲的不好的地方 欢迎大家留言拍砖 1 在linux下会写shell脚本是非常重要的 下面我参照例子给大家展示几个脚本 顺带这学习shell 的语法 什么时候hel
  • 汇编语言(1)——从机器到汇编

    汇编语言 王爽 著 读书笔记 1 汇编语言的出现 最早期出现的计算机 是名副其实的 计算 机 这个机器可以执行一系列特定的指令 即机器指令 而由机器指令构成的集合被称为指令集 也就是我们说的机器语言 机器指令是由一系列的二进制数字0和1构成
  • EMC整改流程及常见问题

    电磁兼容EMC整改专题 目录 EMC整改流程及常见问题 1EMC整改意见 2EMC整改流程 3EMC整改的一些小建议 4总结 电磁兼容 EMC EMC小结之时钟辐射问题 一前言 二测试数据分析 三辐射超标的原因 四结语 EMC整改流程及常见
  • 人机交互期末复习要点

    文章pdf下载 点击下载pdf 注 我们网上的作业 老师说的考试题目 可能会考的重点 无 可能会考选择题 也可能会考大题 比如 人机交互设备 我们这次期末考试就考了 绪论 什么是人机交互技术 是指关于设计 评价和实现供人们使用的交互式计算机
  • matlab中float类型的_数据类型(一)——数值类型

    数值类型包括两种 整数类型和浮点数类型 整数类型 uint8 分别表示有 不带u 无 带u 符号和对应的数值范围 或者说是整数的位数 浮点数类型 单精度 single 和双精度 float 或者直接输入小数 因为matlab默认即为双精度
  • ARM定义特殊寄存器(*(volatile unsigned long *))的理解

    以前老是对ARM程序中 volatile unsigned long 不理解 今天看了两篇文章 觉得对理解这个很有用 当然这个不止在定义内部特殊寄存器有用 在用到外部总线时 根据具体情况 定义外部器件的地址也可以用 下面是文章一 终于理解了
  • 常用IDE正则表达式

    目录 1 notepad 正则表达式 2 VScode正则表达式 3 pycharm正则表达式 梳理常用工具的正则表达式使用 逐步增加其他工具 1 notepad 正则表达式 注意 Notepad 正则表达式字符串最长不能超过69个字符 转
  • Unity做MMD(一)资源处理

    文章目录 unity插件 Blender插件 两者对比 要想把mmd 的模型拿到unity中处理 主要有两个方法 第一个是通过unity的插件将pmx模型文件转化为fbx 第二个就是通过第三方软件将pmx处理 例如blender 如果是想把
  • acwing算法基础__提高__进阶_课

    文章目录 1 排序 1 1 快速排序 分治 1 2 归并排序 分治 2 二分 2 2 整数二分 2 3 小数二分 浮点数二分 3 高精度 4 前缀和与差分 5 双指针算法 6 位运算 7 离散化 8 区间合并 总结 要求 把算法的思想搞懂
  • Mybatis中ResultType和ResultMap的区别

    MyBatis中的ResultType和ResultMap都是用来映射查询结果到Java对象的 ResultType适合简单查询结果的映射 而ResultMap适合复杂查询结果及自定义映射关系的情况 ResultType指定了返回值类型 即
  • 【Unity2D】相机移动以及设置相机边界

    添加相机 添加相机时 首先需要在unity中添加 Cinemachine 包 第一次使用这个包时 需要在Package Manager中搜索并安装 安装Camera Mechine包后 添加2D Camera 设置跟随对象为Ruby 从Hi
  • 在线一键JS混淆还原

    当今 随着互联网的发展 越来越多的网站开始使用JavaScript来实现动态交互和用户体验 但是 由于JavaScript代码的开放性和易于复制 网站管理员需要采取一些措施来保护他们的代码 这就是JavaScript混淆工具产生的原因 js
  • 【经验-强制HTTPS-web】在服务器301强制HTTPS跳转,套上腾讯云CDN后,第一次访问发生不强制跳转HTTPS的问题解决方法

    我的个人站网址 https mdzz pro 今天偶然在编程群里展示了下个人站 没想到大佬居然说我的网站没有开Https 我当场懵逼了 不可能啊 面板上我开了强制Https啊 于是我自己用edge访问了一下 结果发现真是这样 第一次 第二次
  • vim常用设置---(.vimrc详细配置)

    vimrc配置文件内容如下 一般设定 设定默认解码 set fenc utf 8 set fencs utf 8 usc bom euc jp gb18030 gbk gb2312 cp936 不要使用vi的键盘模式 而是vim自己的 se
  • 设计模式--外观模式

    外观模式 属于结构型模式 基本原理 隐藏系统复杂性 为系统开放一个便于使用的接口 主要流程 1 创建系统和子系统 2 创建一个外观类 统一管理子系统的功能 并对外提供接口 注意 外观类是管理子系统和对外提供接口 include
  • 数据库DDL,DML

    数据库DDL DML 一 DDL操作数据库 查询数据库 SHOW DATABASE 创建数据库 创建 CREATE DATABASE 数据库名称 创建 判断 如果不存在则创建 CREATE DATABASE IF NOT EXISTS 数据
  • Cesium加载矢量数据探索——从geojson到矢量切片

    矢量数据由于包含确定的坐标信息 通常用于表达准确的空间位置实体 在cesium中 不支持对shp进行加载 而是需要对shp数据进行转换 一般cesium支持的shp格式如下 geojson topojson kml czml 通常来说 对于
  • 什么是线程?以及线程的总结。(十小点1700字)

    1 什么是程序 进程和线程 2 创建线程的三种方式 3 继承Thread类来创建线程和实现Runable接口创建线程的区别 4 线程的方法 线程的优先级别 编辑 5 线程的状态以及图解 6 多线程的概念 优点 缺点 7 线程同步的概念 编辑
  • shell脚本中的if语句与case语句

    一 if语句 if语句从上至下按照顺序依次判定执行 格式如下 if 判定条件 如果 then 那么 elif 重新的一次判定 又如果 then 那么 else 否则 可以添加也可以不加 fi 结尾 倒写 注意 其中的elif不限个数 可以多
  • new与默认构造函数

    class A public A int i int 0 private int a b class B public 无需构造函数 因为数据成员的全部为public int a b c int main A a 3 B b 1 2 3 A

随机推荐

  • Python之selenium,使用webdriver模拟登录网站(含验证码)

    文章目录 一 前言 二 准备工作 三 模拟登陆网站 1 加载驱动和配置 2 打开网站 3 寻找元素并填入账号密码 4 填写验证码 四 遇到的一些坑 五 后记 一 前言 这段时间做了一个小项目 其中有一段需要自动获取网站后台的数据 但是这个网
  • 如何扩展mvc的消息转换器?

    问题 在服务端向客户端传输id时 由于是采用雪花算法 id长度足有19位之多 于是js接收时就产生了精度丢失问题 那么我们就需要扩展mvc的消息转换器来使后台传向前台的数据格式化为我们想要的格式 自定义消息转换器 public class
  • LaTex创建四级目录

    默认情况下 目录的深度是3级 也就是说 对于 ctexart article 文类 只对 section subsection subsubsection 编目 如果你的文档结构用到了 paragraph 一级 那么它将不会被编入目录中 但
  • Qt5类之QLine and QLineF

    QLine include
  • 成功解决 /bin/sh: 1: source: not found

    执行下列语句报错 解决办法 在命令行输入 exec bash 或直接输入bash 如下图 便可成功使用source命令
  • C++ 开发 Web 服务框架 - HTTP Web 框架的设计与实现(二)

    C 开发 Web 服务框架 HTTP Web 框架的设计与实现 一 概述 项目介绍 服务器开发中 Web 服务是一个基本的代码单元 将服务端的请求和响应部分的逻辑抽象出来形成框架 能够做到最高级别的框架级代码复用 本次项目将综合使用 C 1
  • 【unity】角色动画的 Has Exit Time是什么?什么时候需要打钩?

    场景 在动画的状态机Animator中的Transitions中总能看到Has Exit Time这个选项 到底是否勾选 探究 Has Exit Time 我的理解翻译过来是 是否有一个结束的时间 如果不勾选的话 就是没有结束的反应时间 那
  • 什么是IOC(控制反转),IOC的原理

    什么是控制反转 控制反转也可以理解为创建对象权利的交接 我们在获取对象时 都是采用 new 的方式 是主动的 现在 我们获取对象时 同时跟工厂要 由工厂为我们查找或者创建对象 是被动的 IOC的原理 IOC是通过反射 工厂 容器来完成了对象
  • Win11安装wsl2及深度学习环境配置(Win10应该类似)

    一 wsl2 Ubuntu安装 参考教程 https blog csdn net qq 36622589 article details 123402704 我是从第3步开始的 做到第9步结束就行 图形化我装了 但如果要安装pycharm专
  • Java学习之IDEA环境搭建

    Java学习之IDEA环境搭建 序言 PicGO的Gitee图床设置 owner QMei repo BlogHome path 环境搭建 IDEA环境搭建 同步 2020 11 1 IDEA 版本 Ultimate 2020 2 搜索功能
  • (ros/navigation/slam_gmapping) map_server地图服务器

    http wiki ros org map server 概述 map server提供map server ROS节点 它提供地图数据作为一个ROS服务器 也提供map saver命令行功能 能动态生成保存到文件中的地图 地图格式 包中通
  • leetcode872. 叶子相似的树(java)

    叶子相似的树 题目描述 递归 题目描述 难度 简单 leetcode 872 叶子相似的树 请考虑一棵二叉树上所有的叶子 这些叶子的值按从左到右的顺序排列形成一个 叶值序列 举个例子 如上图所示 给定一棵叶值序列为 6 7 4 9 8 的树
  • QT注册界面练习(信号与槽实现页面跳转)

    一 注册界面练习思路以及具体代码 在完成注册页面搭建的前提下 通过信号与槽机制实现多组件之间的相互通信 实现页面跳转 基本步骤 首先 将注册页面的登录按钮与成功登陆信号绑定 当用户名与密码均匹配时 关闭注册页面 发送跳转信号 其次 在成功登
  • 10款强大的开源 Javascript 图表库

    1 ECharts ECharts 由百度前端技术部开发的 是一个纯 Javascript 的图表库 可以流畅的运行在 PC 和移动设备上 兼容当前绝大部分浏览器 IE8 9 10 11 Chrome Firefox Safari等 底层依
  • 网络安全入门学习第九课——计算机网络基础

    文章目录 一 网路通信三要素 1 IP地址 互联网协议地址 分为公网地址和私有地址 1 1 公网地址的范围 1 2 私网地址的范围 2 端口 2 1 周知端口 2 2 注册端口 2 3 动态端口 3 协议 二 两个终端间通信的五大要素 三
  • vs 引用动态链接库

    1 添加头文件目录 工程 属性 配置属性 c c 常规 附加包含目录 加入头文件所在目录 2 添加静态库目录 工程 属性 配置属性 连接器 常规 附加库目录 加入lib文件所在目录 3 添加lib文件名 工程 属性 配置属性 连接器 输入
  • 浅谈电源芯片选型之低功耗

    浅谈电源芯片选型之低功耗 硬件电路设计中电源芯片选型必不可少 电源芯片选型的好坏关系到系统的稳定性 电源的转换效率等等 在低功耗产品设计中 更关系到系统睡眠或者低功耗模式时的系统总的耗电情况 低功耗产品设计中 电源芯片选型 暂时以LDO电源
  • SPI采样和输出指主从同时的采样和输出

    SPI总线是Motorola公司推出的三线同步接口 同步串行3线方式进行通信 一条时钟线SCK 一条数据输入线MOSI 一条数据输出线MISO 用于 CPU与各种外围器件进行全双工 同步串行通讯 SPI主要特点有 可以同时发出和接收串行数据
  • 使用Loki采集Kubernetes应用日志

    本文章旨在指导如何使用轻量级日志引擎Loki来采集Kubernetes的应用日志 并展示在grafana中 背景 最近我们公司的项目上了Kubernetes集群 产生的大量应用的日志需要采集起来 便于溯源问题 跟踪问题和及时报警 考虑到EL
  • #pragma once和#ifndef,#define,#endif

    pragma once和 ifndef define endif都有防止头文件重复包含的作用 所谓重复包含就是指在源文件中头文件被重复使用了同一个头文件 类似二次定义 造成冗余 1 程序员想出了利用 ifndef define endif防