专栏首页包子的书架#ifndef/#define/#endif使用详解

#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 // 引用标准库的头文件

#include “header.h” // 引用非标准库的头文件

void Function1(…); // 全局函数声明

class Box // 类结构声明

{

};

#endif

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 预编译

    包子388321
  • AspectJ在android上的开发

    Android上运用AOP的思想开发,可以快速的帮助我们简化在横向开发中的重复性工作,简单的说就是把涉及到众多模块的某一类问题进行统一管理比如:性能检测、日志打...

    包子388321
  • 模仿手写andfix的实现原理

    当公司的项目出现问题了,早期的老套路子是解决bug,重新发新版本apk,但是随着技术不断的更新,线上项目出现严重问题,可以通过进行热修复,在不需要发布新版本的情...

    包子388321
  • 基础知识 | 每日一面(61)

    小林:准确的的行为是由实现定义的,这就是应该有文档说明; 通常, 用 <> 括起来的头文件会先在一个或多个标准位置搜索。用 "" 括起来的头文件会首先在 “当前...

    闫小林
  • [C&C++]头文件包含问题

    原文链接:https://blog.csdn.net/humanking7/article/details/79299045

    祥知道
  • C语言 | 每日基础(50)

    阿一:这是个风格问题, 因此有不少的争论。很多人认为 “嵌套包含文件” 应该避免。它让相关定义更难找到,如果一个文件被包含了两次, 它会导致重复定义 错误; 同...

    闫小林
  • Visual Studio2010中的外部依赖项

    Visual Studio2010中的项目下拉列表下面有外部依赖项,里面显示的文件是你程序中显示包含的头文件所包含的的头文件。比如,main函数里面包含了win...

    AIHGF
  • php在线PIng接口源码

    Youngxj
  • 微服务扩展性和高可用-章节2(翻译)

    SLA决定系统是否必须扩展。它们还推动了增长时间表。股票交易系统必须在最低和最高可用性水平内实时扩展。相比之下,电子商务系统可能会在一年中“缓慢”的几个月扩大规...

    日薪月亿
  • Django-5 数据库操作

    这节我们使用Django的model创建数据库表,以及如何使用Django ORM查询数据库并过滤结果。接下来开始:

    亚乐记

扫码关注云+社区

领取腾讯云代金券