#ifndef/#define/#endif使用详解

2023-11-15

 想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?


    其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include "a.h" 和#include "c.h"此时就会造成c.h重复引用。


头文件被重复引用引起的后果:
有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。


    是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?
    答案:不是一定要加,但是不管怎样,用ifnde xxx #define xxx#endif或者其他方式避免头文件重复包含,只有好处没有坏处。个人觉得培养一个好的编程习惯是学习编程的一个重要分支。


    下面给一个#ifndef/#define/#endif的格式:
    #ifndef A_H意思是"if not define a.h"  如果不存在a.h
    接着的语句应该#define A_H  就引入a.h
    最后一句应该写#endif   否则不需要引入
--------------------------------------------------------------------------------------------------
#ifndef GRAPHICS_H // 防止graphics.h被重复引用 
#define GRAPHICS_H 




#include <math.h> // 引用标准库的头文件 
… 
#include “header.h” // 引用非标准库的头文件 
… 
void Function1(…); // 全局函数声明 
… 
class Box // 类结构声明 

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

#ifndef/#define/#endif使用详解 的相关文章

随机推荐

  • 猿创征文

    猿创征文 国产数据实战之docker部署MyWebSQL数据库管理工具 一 MyWebSQL介绍 1 MyWebSQL简介 2 MyWebSQL特点 二 检查本地环境 1 检查docker状态 2 检查docker compose版本 三
  • Ubuntu 20系统WIFI设置静态IP地址,以及断连问题

    最近工作需要购置了一台GPU机器 然后搭建了深度学习的运行环境 在工作中将这台机器当做深度学习的服务器来使用 前期已经配置好多用户以及基础环境 但最近通过xshell连接总是不间断的出现断连现象 补充一点 Ubuntu系统中与网络设置有关的
  • Oracle报错ORA-00911: 无效字符问题

    跑kettle任务 今天写sql查询数据库数据时出现ORA 00911 无效字符问题 我把SQL到toad中是可以查询到数据的 但是在MyECLIPSE中执行就报ORA 00911 无效字符的错误 原因 SQL中 有个 分号 里面多了一个
  • Mac 安装 Neo4j

    1 下载Neo4j 社区版 MacOS安装社区版Neo4j 图数据库 https blog csdn net huacha article details 81123410 问题 在下载JDK时需要Oracle 登陆账号 解决方法 http
  • Vue+ElementUI实现简单的用户管理系统(四):查看用户详情页及删除用户

    一 展示用户详细信息 在点击 查看 按钮时 传递了用户的Id 我们要把这个Id拿出来 this route query id created this handle this route query id handle方法 也就是根据id使
  • [YOLO专题-3]:总体-目标检测的常见模型评估指标

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122134907 目录 前言
  • HTML BFC的理解与作用

    HTML BFC的理解与作用 含义 BFC Block formatting context 直译为 块级格式化上下文 它是一个独立的渲染区域 只有Block level box参与 它规定了内部的Block level Box如何布局 并
  • elasticsearch实现入库分词,查询不分词,实现like关键字%

    因为在工作中遇到一个需求 需要对请求内容实现类似于mysql的 like 关键字 模糊匹配功能 同时要保证效率大数据量效率问题 因此不能使用wildcard在网上看了很多也不太好使 自己琢磨了一下成功了 该功能仅对非中文存储的字段有效果 使
  • Blender软硬边

    https www youtube com watch v CdHXpHPWKYo blender这里的算法感觉就是根据角度做自动平滑 然后mark sharp它就不平滑 貌似有bug 加修改器貌似可以解决这个问题 凹面貌似也有点问题 设置
  • 结合Android Studio和MAT检测并简单分析内存泄露

    1 什么是GC 在分析内存泄露之前首先要了解一下GC GC Garbage Collection 就是Java中常提到的垃圾回收 指的是JVM会自动回收不在被引用的内存数据 2 什么是GC Roots GC Roots即Java虚拟机当前存
  • SAP-基于批次特定计量单位的应用-01-产品数量管理

    原文链接 https mp weixin qq com s zknWGuz2lU387vAGSiykw 大家可以关注我个人公众号 所有分享内容 会在公众号第一时间推送 且阅读排版更好 愿大家的学习 轻松且愉快 如果大家觉得有用 希望转发关注
  • 计算机打字正确姿势,电脑打字手指的正确姿势,涨知识了

    近年来 随着科技水平的提高 电脑已经成为了必不可少的工具了 能够为工作和学习提供一定的便利性 今天来给大家说说在电脑上打字手指应如何摆放 以帮助提高打字的速度 熟悉键盘 01 在开始打字前 首先要对键盘上每个字母对应的位置有一定的了解 不仅
  • LeGO-LOAM代码详细注释版

    学习LeGO LOAM时 写的代码注释github代码链接 一部分注释来自github用户wykxwyc 一部分来自网上查阅 还有一部分是自己的理解 持续更新中
  • C语言---离散数学实验--图的基本概念及其应用

    目录 欧拉图的判定 实验内容 编辑 无向图的判断 算法展示 源码 有向图的判断 算法展示 源码 求欧拉路 算法展示 整体源码 对无向图的判断 对有向图的判断 二叉树的应用 源码 源码下载 实验目的 掌握判断欧拉图的方法 掌握求最优二叉树的方
  • kubeadm常用

    kubeadm常用 配置kubeadm自动补全 初始化一个master节点 导出kubeadm默认配置文件 将node节点加入集群 生成node配置 升级k8s版本 kubeadm升级node 维护或下线node节点 管理kubeadm j
  • 1-2 VS2019常用调试方法(断点设置、条件断点、调试按钮、逐过程、逐语句、监视变量、快速监视)

    文章目录 前言 1 打印数据 2 普通断点 2 1断点快捷键 3 条件断点与条件追踪 4 单步调试 5 添加监视 5 1快速监视 前言 主要调试方法 1 打印数据 2 普通断点 3 条件断点与条件追踪 4 单步调试 5 添加监视 1 打印数
  • JavaWeb自我学习——Request(请求)

    目录 Request 1 继承体系 2 获取请求数据 通用方式获取请求参数 idea模板创建servlet 请求参数中文乱码处理 Tomcat 8 0之后 已将GET请求乱码问题解决 设置默认的解码方式为UTF 8 3 请求转发 请求转发资
  • 中小企业在数字化转型上所面对的问题都有哪些?_光点科技

    随着科技的飞速发展 数字化转型已经成为企业持续发展的必由之路 尤其是中小企业 数字化转型不仅可以提高效率 降低成本 还可以拓展市场 增强竞争力 然而 数字化转型并非一帆风顺 中小企业在这个过程中面临着一系列挑战和问题 1 资金问题 中小企业
  • fb设备驱动1:fb设备的显像原理和步骤

    lcd的显像原理 将DDR内存的一部分划分出来作为显存 显存与lcd显示屏幕之间做一个双向的映射 然后用户只需要将需要显示的内容放入显存之中 然后显存中的内容就会刷新到lcd的储存器中进行显示 显存 在内核之中申请一块内存作为显存 由于内核
  • #ifndef/#define/#endif使用详解

    想必很多人都看过 头文件中的 ifndef define endif 防止该头文件被重复引用 但是是否能理解 被重复引用 是什么意思 是不能在不同的两个文件中使用include来包含这个头文件吗 如果头文件被重复引用了 会产生什么后果 是不