C++中#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
--------------------------------------------------------------------------------------------------
C++中#ifndef/#define/#endif使用详解相关推荐
- #ifndef/#define/#endif使用详解
https://blog.csdn.net/abc5382334/article/details/18052757 想必很多人都看过"头文件中的 #ifndef/#define/#endif ...
- 每日一题(12)—— .h头文件中ifndef/define/endif的作用
.h头文件中ifndef/define/endif的作用? 分析: 防止头文件被重复包含. #ifndef _TEST_H_ #define _TEST_H_/* test.h */#endif / ...
- c/c++头文件中#ifndef/#define/#endif的用法
想必很多人都看过"头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用".但是是否能理解"被重复引用"是什么意思?头文件被重复 ...
- #ifndef HeaderName_h #define HeaderName_h #endif 使用详解
想必很多人都看到过头文件中写有:#ifndef HeaderName_h #define HeaderNa ...
- c语言结构体成员变量私有化,C语言中结构体变量私有化详解
C语言中结构体变量私有化详解 背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚 ...
- ifndef/define/endif——主要目的是防止头文件的重复包含和编译
原文:http://www.jb51.net/article/100939.htm 原文:https://blog.csdn.net/abc5382334/article/details/180527 ...
- STM32(Cortex-M3)启动过程+IAR中xcl及icf文件详解
一:STM32(Cortex-M3)启动过程(入口地址) ARM7和ARM9启动时从绝对地址0X00000000开始执行复位中断程序,即固定了复位后的起始地址,但中断向量表的位置是可变的. Corte ...
- c:#ifndef, #define, #endif 作用
#ifndef, #define, #endif 作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义.文件包含.条件编译)中的 ...
- [Windows编程] #pragma once 和#ifndef ... #define ... #endif 比较
C++中防止头文件被多次include 的常见方式有: 1) 用#ifndef ... #define ... #endif 宏 #ifndef __MYHEADER_H__ #define __ ...
最新文章
- ACM JAVA大数
- Markdown:数学公式(4)
- 广东计算机应用基础试题及答案2019,2019年计算机应用基础试题库及答案.pdf
- Java学习笔记二十二:Java的方法重写
- 汉堡菜单_开发人员在编写汉堡菜单时犯的错误
- php中拼接html代码,如何利用ajax给html动态拼接代码
- 专访联想谢政维:功耗和价格是天蝎项目最大障碍!
- m1 MacBook Air安装原生版本Emacs之方法
- abb机器人指令手册_「ABB」ABB机器人指令模块介绍与开发过程
- SpringCloud学习之SpringCloudStream集成kafka
- SQL笔试之盘古开天
- 阿里云cenos 6.5 模板上安装 docker
- 【Linux系统编程】| 【01】系统编程基本概念
- MATLAB画柱状图(包括普通柱状图,多组柱状图,三维柱状图)
- SpaceEye :12种地球实时卫星照片壁纸
- 苹果手机回收价格怎么查询
- PHP程序员开发win32应用程序之梦
- 4.1.1 OS之初识文件管理概念和功能
- 逆水寒武境斩鸿蒙怎么弄的,逆水寒OL60级紫武怎么打造?逆水寒60级紫武打造流程一览...
- PID控制器原理详解