为什么.h文件里需要#ifndef、#define和#endif?

       本文转载自好小子0325的一篇文章!感觉写的很不错,特意转载方便学习。
       想必很多人都看过“头文件中的 #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

#include 与 #include "file.h"的区别?
#include< >格式:引用标准库头文件,编译器从标准库目录开始搜索(包括编译器设置的路径)
#include" "格式:引用非标准库的头文件,编译器从用户的工作目录开始搜索
双引号表示:
       先在程序的源文件所在的目录查找,如果未找到则去系统默认目录查找,通常用于包括程序作者编写的头文件;
       首先在当前的源文件目录中查找,若未找到才到包含目录中去查找
尖括号表示:
       知道系统默认目录或者括号内的路径查找,通常用于包含系统中自带的头文件。
       在包含文件目录中去查找(包括文件目录是用户在设置环境是设置的),而不在源文件目录去查找;

  • 39
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值