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

举报
holo.yh 发表于 2021/06/02 15:15:55 2021/06/02
【摘要】         想必很多人都看过“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#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

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。