在我们自己编写 C/C++的头文件时,可能会忽略一点:用一些处理机制来避免头文件的重复包含,因为头文件的内容在预编译时是把头文件的内容完全拷贝到引入的地方替换头文件的包含命令,而包含的头文件可能有包含很多内容,所以要是重复包含头文件,可能会使预编译后的源文件代码冗余量很大,造成空间上的浪费。
目前自己用过两个防止头文件重复包含的方法:
1、 #pragma once
2、 #ifndef
  #define
  #endif
  
它们具体实现如下:
假定此时要保证头文件HeadFile.h不会被重复包含,那么两种方法对应的方式如下:
1、 #pragma once
  直接把它放在HeadFile.h文件实现的最前面,即可实现。
  

  #pragma once//头文件的具体实现

2、 #ifndef
  #define
  #endif

  #ifndef __HEADFILE.H__#define __HEADFILE.H__//头文件的具体实现#endif

两种方法的一些差异:
1、 #pragma once由编译器提供保证:同一个文件不会被编译多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
2、 #ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。

#pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了。
#ifndef,#define,#endif是C/C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。

方式一可以避免名字冲突,方式二由语言支持所以移植性好
#pragma once方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受语言天生的支持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持,换言之,它的兼容性不够好。也许,再过几年等旧的编译器死绝了,这就不是什么问题了

防止头文件重复包含之pragma once与#ifndef相关推荐

  1. C/C++ ifndef与头文件重复包含解析

    ifndef 一个预处理指令,作用是判断一个符号是否存在,或者是不存在,与之对应的还有一个ifdef.ifndef一般用于解决头文件重复包含的问题. 符号 符号一般指的是,函数定义的名称,类名,宏名称 ...

  2. C语言 define 防止头文件重复包含 - C语言零基础入门教程

    目录 一.头文件重复包含编译器报错 1.简单的理解头文件重复包 2.老流氓的理解头文件重复包 二.通过宏定义解决头文件重复包含 1.通过 #ifndef / #define 解决头文件重复包含 2.通 ...

  3. C++头文件重复包含问题分析及解决方案

    一.头文件重复包含问题分析 1) 问题重现 举例说明.假设在某个C++ 头文件 或 源文件 中,包含了A.h和B.h两个头文件: #include "A.h" #include & ...

  4. c++ 1:非MFC工程使用MFC库时的问题及解决办法(如果要用CString或者提示windows头文件重复包含)...

    非MFC工程使用MFC库时的问题及解决办法(如果要用CString或者提示windows头文件重复包含) vc6和vc71的工程向导中都包含非MFC的工程,诸如win32 console projec ...

  5. 如何解决头文件重复包含和宏的重复定义问题:用#ifndef 、#define、#endif

    如何解决头文件重复含问题 #ifndef .#define.#endif的作用是: (1)防止宏的重复定义 (2)防止有文件的重复包含 #ifndef _A_H_ #define _A_H_ .... ...

  6. C语言头文件为什么要加#ifndef #define #endif(防止头文件重复包含)

    当你用VC的菜单新增一个类,你会发现自动生成的代码总是类似下面的样子: #if !defined(AFX_XXXX__INCLUDED_)#define AFX_XXXX__INCLUDED_具体代码 ...

  7. 套头文件html重复,关于C++头文件重复包含的问题

    #ifndef PEOPLE_H #define PEOPLE_H /* - */ #endif 这样写能够防止头文件被重复包含 在头文件中定义变量不是不规范,而是一种错误. 原因在于 如果在head ...

  8. C++中头文件相互包含的几点问题

    一.类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题.假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中, ...

  9. C++头文件重复定义问题的处理(不会看看,会了防身!)

    在设计一个类的时候,通常是将类的定义及类成员函数的声明放到头文件(即.h文件)中,将类中成员函数的实现放到源文件(即.cpp)中.对于animal类需要animal.h和animal.cpp两个文件, ...

最新文章

  1. Ubuntu 18.04安装中文输入法
  2. centos 7 安装jdk1.8
  3. vue渲染html失败,Vue ssr失败,渲染的html为undefined
  4. Django模版(二)
  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
  6. 下次偶转贴贴子时得加上转贴才行~~~
  7. 连登 GitHub TOP 榜,中国开发者在行动!
  8. angularJS中搜索框的用法
  9. git命令行常用操作及在linux下push到github项目中遇到的问题
  10. Jupyter Notebook 快速入门
  11. html页面书签,利用CSS实现书签效果实例源码
  12. matlab方程例子,Matlab求解超定方程组实例
  13. Mac用户如何修改 tmux 的指令前缀Ctrl+b为Ctrl+a
  14. 各种动漫情侣姿势的画法
  15. 什么是SAAS模式网站?
  16. 1.2 Unity3D 的注册
  17. kaldi跑自己数据遇到的问题合集(持续更)
  18. 英特尔应用服务器,英特尔(Intel)服务器CPU全解析(图)
  19. 【目标检测】目标检测的评价指标(七个)
  20. 妻子和鱼----海子

热门文章

  1. 支付宝工程师如何搞定关系数据库的“大脑”——查询优化器
  2. 迈向电商认知智能时代的基石:阿里电商认知图谱揭秘
  3. 理论与实践:如何从Hadoop迁移到MaxCompute
  4. 如何在阿里云•对象存储OSS托管用户域名的https证书
  5. 深度好文 | 战“疫”上云正当时:打开云计算的正确姿势
  6. 钉钉流量暴增百倍,阿里云抗住了!
  7. 996!007!同是敲了2万行代码,为什么他却晋升了?
  8. js组装知识(待续……)
  9. linux服务器查看mysql服务名称_Linux服务器查看MySQL信息
  10. c#日期转换周几_C#获取每个年,月,周的起始日期和结束日期的方法