#ifndef/#define/#endif

头文件中的 #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

给你举个例子,再顺便分析一下:
假设你的工程里面有4个文件,分别是a.cpp,b.h,c.h,d.h。
a.cpp的头部是:
#include "b.h "
#include "c.h "

b.h和c.h的头部都是:
#include "d.h "

而d.h里面有class D的定义。

这样一来,
编译器编译a.cpp的时候,先根据#include "b.h "去编译b.h这个问题,再根据b.h里面的#include "d.h ",去编译d.h的这个文件,这样就把d.h里面的class D编译了;
然后再根据a.cpp的第二句#include "c.h ",去编译c.h,最终还是会找到的d.h里面的class D,但是class D之前已经编译过了,所以就会报重定义错误。

加上ifndef/define/endif,就可以防止这种重定义错误。
--------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
1.比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。 还是把头文件的内容都放在#ifndef和#endif中吧。
不管你的头文件会不会被多个文件引用,你都要加上这个。
一般格式是这样的:
#ifndef <标识>
#define <标识>
......
......
#endif <标识>
在理论上来说可以是自由命名的,但每个头文件的这个“标识”都应该是唯一的。标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的“.”也变成下划线,如:stdio.h

#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif

--------------------------------------------------------------------------------------------------

posted on 2018-07-17 11:20 眷恋你的方圆 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/share-happy-everyday/p/9322394.html

#ifndef/#define/#endif相关推荐

  1. ifndef/define/endif——主要目的是防止头文件的重复包含和编译

    原文:http://www.jb51.net/article/100939.htm 原文:https://blog.csdn.net/abc5382334/article/details/180527 ...

  2. c:#ifndef, #define, #endif 作用

    #ifndef, #define, #endif 作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译)中的 ...

  3. c/c++头文件中#ifndef/#define/#endif的用法

    想必很多人都看过"头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用".但是是否能理解"被重复引用"是什么意思?头文件被重复 ...

  4. [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较

    C++中防止头文件被多次include 的常见方式有: 1) 用#ifndef ...  #define ... #endif  宏 #ifndef __MYHEADER_H__ #define __ ...

  5. C语言头文件为什么要加#ifndef #define #endif(防止头文件重复包含)

    当你用VC的菜单新增一个类,你会发现自动生成的代码总是类似下面的样子: #if !defined(AFX_XXXX__INCLUDED_)#define AFX_XXXX__INCLUDED_具体代码 ...

  6. C++中#ifndef/#define/#endif使用详解

    想必很多人都看过"头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用".但是是否能理解"被重复引用"是什么意思?是不能在不同的两个 ...

  7. 【转载】#pragma once与#ifndef #define #endif的区别

    一.相同点         两者的共同点都是为了避免同一个文件被 include 多次,但是 #ifndef #define #endif 不只有这个作用.  在能够支持这两种方式的编译器上,二者并没 ...

  8. #ifndef.#define, #endif 的用法

    文件中的#ifndef.#define, #endif 很关键,是为了避免多重包含,比如如果两个C文件同时包含同一头文件,那么就会出现问题,所以使用这种方法可以有效避免这种情况. 一般用法: 以add ...

  9. 每日一题(12)—— .h头文件中ifndef/define/endif的作用

     .h头文件中ifndef/define/endif的作用? 分析: 防止头文件被重复包含. #ifndef _TEST_H_ #define _TEST_H_/* test.h */#endif / ...

最新文章

  1. java update多个字段的值_SQL的update多个字段的写法
  2. FastDFS简介和安装
  3. 小米 pegasus_使用Google的Pegasus库生成摘要
  4. figma下载_素描vs Figma困境
  5. 将模板方法模式应用到kmeans聚类算法
  6. Google再次从官方商店下架伪装成合法程序的恶意应用
  7. OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
  8. And seeing the whole machine market
  9. Java多线程系列---“基础篇”08之 join()
  10. python安装选项_Python PyInstaller安装和使用教程(详解版)
  11. 【QGIS】【OsGeo4w】安装方法
  12. Anaconda 下载与安装详细教程
  13. 云栖号在线课堂—云服务器数据库快速入门特辑
  14. 语音播报收款Java_Android实现收款成功金额的语音播报功能
  15. Python实现Mean Shift算法
  16. 搜索摄像头/录像机IP地址工具是什么
  17. 计算机网络:运输层(流量控制,拥塞控制,连接管理)
  18. oracle如何总计,如何在Oracle中产生分组小计和总计?
  19. 绩效考核管理系统使用说明2
  20. 【信息安全-科软课程】Lab2环境变量和Set-UID程序实验

热门文章

  1. MONGODB 集群 配置及 客户端PHP 连接
  2. AndroidStudio Gradle自定义属性xmlns无法识别
  3. 【Android】invalidte和draw的方向
  4. 【Android】事件传递:向下拦截,向上处理
  5. COM(组件对象模型)
  6. 微信浏览器打开网页被拦截了?Mindjump快速解决微信屏蔽网址用户打不开的难题...
  7. Java并发编程—ThreadLocal用法详解
  8. Mybatis的CRUD之XML方式以及动态SQL
  9. android常用工具收集
  10. auth复习和BBS项目的登录(1)