参考资料来源于网上,还未经本人实验证明。

1 作用

  防止头文件被重复包含和编译。 头文件重复包含会增大程序大小,重复编译增加编译时间。

  解释#ifndef起到的效果是防止一个源文件多次包含同一个头文件。那么一个源文件为什么会两次包含同一个头文件呢?
  你写的test.cpp里包含了a.hb.ha.h里包含了b.h,所以b.h就会被包含和编译两次。

/*file: test.cpp*/
#include <a.h>
#include <b.h>
······
/*file: a.h*/
#include <b.h>
······

2 缺失ifndef的风险

1、重复定义
如果b.h中定义了一个变量b,在编译test.cpp时就会报重复定义的错误。

/*file: test.cpp*/
#include <a.h>
#include <b.h>
······
/*file: a.h*/
#include <b.h>/*file: b.h*/
int b;
······

预处理阶段test.cpp展开头文件后变成:

/*file: test.cpp*/
/*#include <a.h> -> #include <b.h>*/
int b;
······
/*#include <b.h>*/
int b;
······

变量b重复定义。

2、无限循环编译
你写的test.cpp里包含了a.hb.ha.h里包含了b.hb.h里包含了a.h,所以a.hb.h就会循环包含,预处理阶段就会不停地循环展开头文件。

/*file: test.cpp*/
#include <a.h>
#include <b.h>
······
/*file: a.h*/
#include <b.h>
······
/*file: b.h*/
#include <a.h>
······

编译器会报Error #include nested too deeply的错误。

3 解决办法

以无限循环编译中的情况为例,把a.h改写成:

#ifndef _A_H_
#define _A_H_
...
#include <b.h>
...
#endif
······

这样子为什么不会报错了呢?
  在预处理阶段,会先展开test.cpp中的头文件a.h,执行到#ifndef _A_H_,发现此时并没有_A_H_并没有被define,所以继续执行#define _A_H_,此时_A_H_就被define了;当展开b.h,执行到文件里的#include <a.h>,进入a.h执行#ifndef _A_H_,发现_A_H_已经被define了,所以直接跳到a.hendif之后的语句执行。这样子就可以保证a.h不会被重复包含。如果要确保b.h不会被重复包含就该写成:

#ifndef _B_H_
#define _B_H_
...
#include <a.h>
...
#endif
······

4 建议

  所有头文件前后都加上ifndef/define/endif。

5 reference

1、主要目的:https://zhidao.baidu.com/question/22559696.html 如下图所示。

2、隐藏危险-重复定义:https://www.jb51.net/article/100939.htm
3、隐藏危险-无限循环编译:https://blog.csdn.net/weixin_41656968/article/details/80493923

【C/C++】ifndef/define/endif的作用相关推荐

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

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

  2. #ifndef #define #endif的作用

    #ifndef #define #endif的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件.当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误. 在头文件中实用#ifn ...

  3. #ifndef, #define, #endif的作用

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

  4. c语言中endif的作用,C语言中#ifdef,#ifndef和#endif的作用

    现在规定一下头文件书写规范, 根据陈皓编写的跟我一起些makefile,一定要记住:头文件中应该只是声明,而定义应该放在C/C++文件中.否则如果出现有定义,比如头文件中有int a =2;如果有多个 ...

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

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

  6. #ifndef, #define, #endif 作用

    目录 #ifndef, #define, #endif 作用 #ifndef #ifdef #define #ifndef, #define, #endif 作用 #ifndef 它是if not d ...

  7. C++ ifndef /define/ endif 作用和用法

    ifndef/define/endif"主要目的是防止头文件的重复包含和编译 比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件 ...

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

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

  9. 头文件为什么要加#ifndef #define #endif

    一 #ifndef 在头文件中的作用 一个大的软件工程里有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量"重定义"的错误.这时在头文件中使用#ifn ...

最新文章

  1. 在baidu上找到自己
  2. 小白重装系统教程_怎么一键重装系统:安装win10系统详细图文教程
  3. 系统管理工具top、glances、dstat比较
  4. Linux 使用ps命令查看某个进程文件的启动位置
  5. grep从文件末尾开始找_c++ 开始之旅
  6. 前端学习(2850):简单秒杀系统学习之绝对定位
  7. 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
  8. m031开发 新唐_M031
  9. python - 2 8 16进制/颜色/字符编码
  10. mac地址修改_Mac 地址是什么?Mac 地址的修改及妙用!
  11. android 异步图片加载 开源,异步加载图片BitmapFun分析
  12. ONVIFclient搜索设备获取rtsp地址开发笔记(精华篇)
  13. HTTPS 使用成本
  14. 机器学习分类模型评价指标和方法
  15. tamtam-nuget-imageserver
  16. 静态的通讯录(C语言)
  17. 防火墙放开oracle远程,oracleMTS模式下防火墙如何开通
  18. OFDM子载波频率 知乎_SDR (软件无线电)
  19. John the Ripper破解密码
  20. 抽象代数之循环群的自同构群是循环群

热门文章

  1. ui(new Ui::MainWindow) 解惑
  2. GB50204-2015 混凝土结构工程施工质量验收规范 免费下载
  3. 2022卡塔尔世界杯。CSDN世界杯勋章来啦
  4. Apache虚拟主机相关配置
  5. 免费开源的箱包制造行业ERP管理系统介绍
  6. 【JavaScript】小数点精度问题,小数点后两位toFixed(),把四舍六入五凑偶,修改成四舍五入
  7. 财务报表究竟是什么?怎么做?
  8. 同时查询多个韵达快递物流信息,分析出多次派件的单号
  9. 混合波束成形matlab,探索 5G 系统的混合波束成形架构
  10. GitLab使用CAS服务进行单点登录配置