当前位置: 首页 > news >正文

[Oh My C++ Diary]#ifndef / #define / #endif 使用详解

想必很多人都看过“头文件中的 #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

———————————————— 版权声明:本文为CSDN博主「叶子一哥」的原创文章,遵循 CC 4.0 BY-SA
版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/abc5382334/article/details/18052757

相关文章:

  • MySQL添加注释(comment)
  • MySQL复制表的结构、内容(数据)的方法
  • MySQL5.7永久统一编码/字符集为utf8(解决乱码)
  • MySQL5.7将编码由utf8改为utf8mb4(字符集)
  • MySQL撤销外键约束
  • MySQL将数据库和已建的表转换成utf8mb4的语句
  • MySQL显示数据表的列名
  • MySQL:Invalid use of group function解决办法
  • [Oh My C++ Diary]类继承和类组合(内嵌类)初始化的不同
  • [Oh My C++ Diary]operator++()和operator++(int)的区别
  • CSS3: nth-child使用总结
  • js setattribute批量设置css样式
  • Asp类
  • 位运算符
  • media=screen
  • [LeetCode] Wiggle Sort
  • C++类中的特殊成员函数
  • ECMAScript6(0):ES6简明参考手册
  • JavaScript类型识别
  • js ES6 求数组的交集,并集,还有差集
  • Node 版本管理
  • Redux系列x:源码分析
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Wamp集成环境 添加PHP的新版本
  • 电商搜索引擎的架构设计和性能优化
  • 后端_MYSQL
  • 将 Measurements 和 Units 应用到物理学
  • 每天一个设计模式之命令模式
  • 前端自动化解决方案
  • 区块链共识机制优缺点对比都是什么
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (13)Hive调优——动态分区导致的小文件问题
  • (20050108)又读《平凡的世界》
  • (二)hibernate配置管理
  • (二)WCF的Binding模型
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (十六)Flask之蓝图
  • (原創) 物件導向與老子思想 (OO)
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转)详解PHP处理密码的几种方式
  • (转)一些感悟
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET Remoting学习笔记(三)信道
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET框架设计—常被忽视的C#设计技巧
  • .net连接oracle数据库
  • .NET业务框架的构建
  • @Mapper作用
  • @synthesize和@dynamic分别有什么作用?
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!