【C/C++】ifndef/define/endif的作用
参考资料来源于网上,还未经本人实验证明。
1 作用
防止头文件被重复包含和编译。 头文件重复包含会增大程序大小,重复编译增加编译时间。
解释:#ifndef
起到的效果是防止一个源文件多次包含同一个头文件。那么一个源文件为什么会两次包含同一个头文件呢?
你写的test.cpp
里包含了a.h
和b.h
,a.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.h
和b.h
,a.h
里包含了b.h
,b.h
里包含了a.h
,所以a.h
,b.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.h
里endif
之后的语句执行。这样子就可以保证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的作用相关推荐
- 每日一题(12)—— .h头文件中ifndef/define/endif的作用
.h头文件中ifndef/define/endif的作用? 分析: 防止头文件被重复包含. #ifndef _TEST_H_ #define _TEST_H_/* test.h */#endif / ...
- #ifndef #define #endif的作用
#ifndef #define #endif的作用 在一个大的软件工程里面,可能会有多个文件同时包含一个头文件.当这些文件编译链接成一个可执行文件时,就会出现大量重定义的错误. 在头文件中实用#ifn ...
- #ifndef, #define, #endif的作用
目录 作用 示例 作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译)中的一种--条件编译. 在c语言中, ...
- c语言中endif的作用,C语言中#ifdef,#ifndef和#endif的作用
现在规定一下头文件书写规范, 根据陈皓编写的跟我一起些makefile,一定要记住:头文件中应该只是声明,而定义应该放在C/C++文件中.否则如果出现有定义,比如头文件中有int a =2;如果有多个 ...
- c:#ifndef, #define, #endif 作用
#ifndef, #define, #endif 作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译)中的 ...
- #ifndef, #define, #endif 作用
目录 #ifndef, #define, #endif 作用 #ifndef #ifdef #define #ifndef, #define, #endif 作用 #ifndef 它是if not d ...
- C++ ifndef /define/ endif 作用和用法
ifndef/define/endif"主要目的是防止头文件的重复包含和编译 比如你有两个C文件,这两个C文件都include了同一个头文件.而编译时,这两个C文件要一同编译成一个可运行文件 ...
- 【转载】#pragma once与#ifndef #define #endif的区别
一.相同点 两者的共同点都是为了避免同一个文件被 include 多次,但是 #ifndef #define #endif 不只有这个作用. 在能够支持这两种方式的编译器上,二者并没 ...
- 头文件为什么要加#ifndef #define #endif
一 #ifndef 在头文件中的作用 一个大的软件工程里有多个文件同时包含一个头文件,当这些文件编译链接成一个可执行文件时,就会出现大量"重定义"的错误.这时在头文件中使用#ifn ...
最新文章
- 在baidu上找到自己
- 小白重装系统教程_怎么一键重装系统:安装win10系统详细图文教程
- 系统管理工具top、glances、dstat比较
- Linux 使用ps命令查看某个进程文件的启动位置
- grep从文件末尾开始找_c++ 开始之旅
- 前端学习(2850):简单秒杀系统学习之绝对定位
- 轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
- m031开发 新唐_M031
- python - 2 8 16进制/颜色/字符编码
- mac地址修改_Mac 地址是什么?Mac 地址的修改及妙用!
- android 异步图片加载 开源,异步加载图片BitmapFun分析
- ONVIFclient搜索设备获取rtsp地址开发笔记(精华篇)
- HTTPS 使用成本
- 机器学习分类模型评价指标和方法
- tamtam-nuget-imageserver
- 静态的通讯录(C语言)
- 防火墙放开oracle远程,oracleMTS模式下防火墙如何开通
- OFDM子载波频率 知乎_SDR (软件无线电)
- John the Ripper破解密码
- 抽象代数之循环群的自同构群是循环群
热门文章
- ui(new Ui::MainWindow) 解惑
- GB50204-2015 混凝土结构工程施工质量验收规范 免费下载
- 2022卡塔尔世界杯。CSDN世界杯勋章来啦
- Apache虚拟主机相关配置
- 免费开源的箱包制造行业ERP管理系统介绍
- 【JavaScript】小数点精度问题,小数点后两位toFixed(),把四舍六入五凑偶,修改成四舍五入
- 财务报表究竟是什么?怎么做?
- 同时查询多个韵达快递物流信息,分析出多次派件的单号
- 混合波束成形matlab,探索 5G 系统的混合波束成形架构
- GitLab使用CAS服务进行单点登录配置