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


C++中#ifndef/#define/#endif使用详解相关推荐

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

    https://blog.csdn.net/abc5382334/article/details/18052757 想必很多人都看过"头文件中的 #ifndef/#define/#endif ...

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

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

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

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

  4. #ifndef HeaderName_h #define HeaderName_h #endif 使用详解

    想必很多人都看到过头文件中写有:#ifndef HeaderName_h                                                #define HeaderNa ...

  5. c语言结构体成员变量私有化,C语言中结构体变量私有化详解

    C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...

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

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

  7. STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解

    一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的. Corte ...

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

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

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

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

最新文章

  1. ACM JAVA大数
  2. Markdown:数学公式(4)
  3. 广东计算机应用基础试题及答案2019,2019年计算机应用基础试题库及答案.pdf
  4. Java学习笔记二十二:Java的方法重写
  5. 汉堡菜单_开发人员在编写汉堡菜单时犯的错误
  6. php中拼接html代码,如何利用ajax给html动态拼接代码
  7. 专访联想谢政维:功耗和价格是天蝎项目最大障碍!
  8. m1 MacBook Air安装原生版本Emacs之方法
  9. abb机器人指令手册_「ABB」ABB机器人指令模块介绍与开发过程
  10. SpringCloud学习之SpringCloudStream集成kafka
  11. SQL笔试之盘古开天
  12. 阿里云cenos 6.5 模板上安装 docker
  13. 【Linux系统编程】| 【01】系统编程基本概念
  14. MATLAB画柱状图(包括普通柱状图,多组柱状图,三维柱状图)
  15. SpaceEye :12种地球实时卫星照片壁纸
  16. 苹果手机回收价格怎么查询
  17. PHP程序员开发win32应用程序之梦
  18. 4.1.1 OS之初识文件管理概念和功能
  19. 逆水寒武境斩鸿蒙怎么弄的,逆水寒OL60级紫武怎么打造?逆水寒60级紫武打造流程一览...
  20. PID控制器原理详解

热门文章

  1. 只因这个模型,它 1 年增长 44%,收入达 2.15 亿美元
  2. puppetter安装就踩坑-解决篇
  3. centos 桥接配置 设置网络代理 lnmp搭建
  4. 如何正确使用AD构造企业的组织架构
  5. Memcached与Redis
  6. Jenkins实战演练之Linux服务器快速搭建
  7. 关于STRONG NAME
  8. Work Measurement - 1
  9. 你总是不要等到完全准备好了再去做事情
  10. 牛客寒假5-D.炫酷路途