#pragma once 与#ifndef 的区别解析

2023-11-03

原文地址:http://blog.csdn.net/hkx1n/article/details/4313303

 

作用:为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。

在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
    

方式一:
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 声明、定义语句
    #endif


    方式二:

    #pragma once
    ... ... // 声明、定义语句

 

    #ifndef的方式受C/C++语言标准支持。它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。
    当然,缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,编译器却硬说找不到声明的状况——这种情况有时非常让人抓狂。
    由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。

    #pragma once一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。
    其好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。大型项目的编译速度也因此提高了一些。
    对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。

    #pragma once方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受C/C++语言标准的支持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。一般而言,当程序员听到这样的话,都会选择#ifndef方式,为了努力使得自己的代码“存活”时间更久,通常宁愿降低一些编译性能,这是程序员的个性,当然这是题外话啦。

    还看到一种用法是把两者放在一起的:

    #pragma once
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 声明、定义语句
    #endif

    看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险,也无法避免不支持#pragma once的编译器报错,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。

    选择哪种方式,应该在了解两种方式的情况下,视具体情况而定。只要有一个合理的约定来避开缺点,我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了,应当由程序员自己或者小范围内的开发规范来搞定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#pragma once 与#ifndef 的区别解析 的相关文章

  • 侯捷系列:c++面向对象高级编程(上)

    文章目录 基于对象的程序设计 不带有指针成员变量的类 以复数类 Complex 为例 头文件的结构 访问级别 函数设计 内联函数 构造函数 常量成员函数 参数的值传递和引用传递 返回值的值传递和引用传递 友元 操作符重载 在类内声明 pub
  • C++操作SQLite数据库

    准备工作 在使用C 操作SQLite之前 需要获得sqlite3 h sqlite3 lib sqlite3 dll 大家可以在 这里 下载 并将这3个文件导入VC 工程中 其中sqlite3 dll文件放到Debug文件夹里 SQLite
  • R语言学习笔记:分析学生的考试成绩

    孩子上初中时拿到过全年级一次考试所有科目的考试成绩表 正好可以用于R语言的统计分析学习 为了不泄漏孩子的姓名 就用学号代替了 感兴趣可以下载测试数据进行练习 num class chn math eng phy chem politics
  • 范围for语句

    C 新标准提供的范围for语句 这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作 其语法形式是 for declaration expression statement 其中 expression 部分是一个对象 用于表示一个序列
  • 解决“17: 错误:程序中有游离的‘\240’,\302’

    参考链接 https blog csdn net asuphy article details 54602426 执行如下命令即可 sed i s o240 o302 g dy haikang test cpp
  • std::nth_element bug引起的crash问题

    1 源码 auto less compare const MirroringGroup mg1 const MirroringGroup mg2 gt bool return mg1 usage lt mg2 usage std nth e
  • C/C++ 引用作为函数的返回值

    语法 类型 函数名 形参列表 函数体 特别注意 1 引用作为函数的返回值时 必须在定义函数时在函数名前将 2 用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本 代码来源 RUNOOB include
  • 【C++】VS code如何配置使用C++(手把手教学)

    博 主 米码收割机 技 能 C Python语言 公众号 测试开发自动化 获取源码 商业合作 荣 誉 阿里云博客专家博主 51CTO技术博主 专 注 专注主流机器人 人工智能等相关领域的开发 测试技术 VS code如何配置使用C 手把手教
  • 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)<转>

    干货 Chrome插件 扩展 开发全攻略 不点进来看看你肯定后悔 写在前面 我花了将近一个多月的时间断断续续写下这篇博文 并精心写下完整demo 写博客的辛苦大家懂的 所以转载务必保留出处 本文所有涉及到的大部分代码均在这个demo里面 h
  • ATL字符串转换宏

    有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏 你相信吗 头文件 d program files microsoft visual studio 8 vc atlmfc include
  • R----dplyr包介绍学习

    dplyr包 plyr包的替代者 专门面对数据框 将ddplyr转变为更易用的接口 gt 来自dplyr包的管道函数 其作用是将前一步的结果直接传参给下一步的函数 从而省略了中间的赋值步骤 可以大量减少内存中的对象 节省内存 可惜的是应用范
  • 模板的完全特例化和部分特例化

    介绍 完全特例化就是类型完全明确的版本 而部分特例化指的是 只知道是几个参数的函数而不知道参数的类型 或者是只知道是引用或者是指针类型 而不知道具体是char 还是 int 模板特例化实例1 template
  • C++:指向类的成员的指针

    引 想必接触过C的朋友们对C语言中指针的概念已经有了深入的了解 如果初步进行了解的朋友可以看一下 C语言基础学习笔记 指针展开来讲的基本知识点包括 指针的概念 指针的定义和初始化及简单使用 指针函数和函数指针 有关指针函数和函数指针的内容上
  • C++学习笔记12:输入输出流实例整理(文本文件读写,二进制文件读写,一组数据的文件读写,随机访问文件实例

    这也太难记了555老阔疼 文件读写示例 include
  • 【C/C++】 - Linux下查找函数头文件 以及 man命令拓展

    背景 比如现在需要找C语言 sleep函数的头文件 使用man来查找 可以先man sleep 可以发现出来的默认是sleep 1 是一个User Commands 明显不是我们需要的 这里提示了 看sleep 3 那我们查看下sleep
  • 一个简单的参数帮助框架,c实现

    文章目录 具体实现如下 include
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C++常见STL容器基本用法

    1 vector include
  • C 语言文件读取全指南:打开、读取、逐行输出

    C 语言中的文件读取 要从文件读取 可以使用 r 模式 FILE fptr 以读取模式打开文件 fptr fopen filename txt r 这将使 filename txt 打开以进行读取 在 C 中读取文件需要一点工作 坚持住 我

随机推荐

  • Umi4 从零开始实现动态路由、动态菜单

    Umi4 从零开始实现动态路由 动态菜单 前言 前期准备 数据表 Mock数据 定义类型 开始 获取路由信息 patchRoutes routes routeComponents 生成动态路由所需的数据 formattedRoutePath
  • Unity(使用GUI制作第一人称鼠标准星)

    属性 简介 方法 注意 准星一般都放在屏幕正中央 所以屏幕的 宽高 2 可得中心点 屏幕宽度 Screen Width 屏幕高度 Screen Height 矩形宽度 自己声明的变量这里使用W代替 矩形高度 自己声明的变量这里使用H代替 准
  • 全国大学生物联网设计竞赛作品

    本文分享自中移OneOS微信公众号 全国大学生物联网设计竞赛优秀作品巡展 陪你长大 智慧养鸡小助手 近几年 鸡福利养殖越来越受关注 表现动物的天性是动物福利定义之一 保证家鸡有合适的活动空间和足够的有氧运动 才能保证拥有动物的天性 对家鸡的
  • 前端项目上线优化

    1 格式化代码 使用eslint 代码检查代码的格式 vs code 想要格式化 vue 文件 需要安装 vetur插件 可以格式化代码并且变成彩色 atl shif f快捷键 vetur格式化格式化代码 还是不符合 eslint 规范 字
  • Docker容器应用日志查看

    docker attach命令 docker attach options 容器会连接到正在运行的容器 然后将容器的标准输入 输出和错误流信息附在本地打印出来 命令中options的取值有三种 detach keys no stdin si
  • 墨盒和墨仓打印机区别?

    打印机有激光打印机 喷墨打印机 针式打印机等多个种类 其中日常文件打印最长使用到的就是激光打印机和喷墨打印机 喷墨打印机分两种类 1 墨仓式喷墨打印机 2 墨盒式喷墨打印机 1 供墨方式不一样 墨盒式喷墨打印机 使用的是独立的墨盒装入打印机
  • 正大新闻:炒期货巨亏7000万引股价大跌豪悦护理回购+增持

    昨日晚间 上市公司豪悦护理发布公告称 拟以1 4亿元 2亿元回购股份 回购价格不超过75元 股 另外 其控股股东 实际控制人李志彪拟3个月内增持2000万元 5000万元 值得注意的是 通过近几日的公告可以发现 此次回购或为豪悦护理对近日因
  • 想要设计自己的微服务?看这篇文章就对了

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由我就静静地看 发表于云 社区专栏 本文通过使用Spring Boot Spring Cloud和Docker构建的概念验证应用程序的示例 为了解常见的微服务架构模式提供了一个起
  • 前端练手项目合集40.0个,附源码,2022年最新

    今天分享40个博主平时收集整理的前端练手项目 都是一些适合前端新手的小项目合集 1 网易云音乐首页制作 2 实战项目之今日头条 3 实战项目之拉勾网 4 ReactNative项目之美食APP 5 uni APP项目实战教程 6 React
  • 测试人员掌握基本Linux命令——查看日志(实时日志)

    很多初级测试人员 在进行执行测试用例这个步骤时 发现bug 不能更加的准确去定位bug 在这样的情况下就可以打开Linux服务器 敲命令查看操作进行中的实时日志 当系统报错时 可以截图日志在缺陷管理系统中 开发人员就知道什么地方错了 操作步
  • rocksdb原理_ceph性能调优历程-rocksdb篇(1)

    最近调优及其他工作实在太忙 没有太多时间写心得 今天抽空来总结一下阶段性成果吧 从一开始的ceph调研 系统调优开始 ceph集群存储大规模数据之后 集群文件数超过2亿 rgw并发写性能下降的问题一直困扰我们 终于在最近找到了原因及相关解决
  • C++primer Plus 第七章复习题

    1 使用函数的3个步骤是什么 定义函数 提供原型 调用函数 2 请创建与下面的描述匹配的函数原型 igor 没有参数 且没有返回值 void igor tofu 接受一个int参数 并返回一个float float tofu int mpg
  • 去除discuz手机版链接&mobile=2后缀

    discuz手机版链接自动添加 mobile 2 导致百度收录的手机版链接无法打开 解决思路 1 打开 source class helper helper mobile php文件搜索下面代码 约在22行 content preg rep
  • malloc的底层实现(ptmalloc)

    前言 本文主要介绍了ptmalloc对于内存分配的管理 结合网上的一些文章和个人的理解 对ptmalloc的实现原理做一些总结 内存布局 介绍ptmalloc之前 我们先了解一下内存布局 以x86的32位系统为例 从上图可以看到 栈至顶向下
  • 【深度学习】_amax() got an unexpected keyword argument ‘dim‘ 解决方案

    在定义一个点云数据pc后 想使用pc max dim 0 然后出现了 amax got an unexpected keyword argument dim 这个是因为对于tensor类型的数据和ndarray类型的数据都有一个max mi
  • 彻底搞懂字符编码ASCII,GB2312,UNICODE,UTF-8

    文章目录 基础 什么是字符编码 正文 ASCII ASCII扩展码 GB2312 GBK DBCS UNICODE UTF 8 UTF 16 USC 2 UTF 32 USC 4 编程语言对字符编码的支持 阅读了一篇关于编码的博客 点击打开
  • Matlab实现PSO算法(附上10个完整仿真源码)

    PSO Particle Swarm Optimization 是一种优化算法 它模拟了鸟群或鱼群等动物的集体行为 通过群体智能的方式来解决优化问题 PSO算法最初由Kennedy和Eberhart在1995年提出 近年来得到了广泛的应用
  • 区块链上的订阅

    为分散式应用程式 以太坊 实施订阅模型 Luca Bravo在Unsplash上拍摄的背景照片 以太坊徽标 火种金标志 介绍 您可能已经听说过 去中心化的应用程序将成为互联网的未来 为了使这个分散的生态系统蓬勃发展并可持续发展 我们将需要许
  • 人工智能数学基础---定积分2:定积分的性质

    一 引言 在 人工智能数学基础 定积分1 定积分的概念以及近似计算 介绍了定积分的概念 几何意义 用定义来求定积分的案例以及使用矩形法 梯形法和抛物线法求定积分近似值的方法和案例等基础知识 根据上文的介绍 结合相关知识补充如下2条规则 可以
  • #pragma once 与#ifndef 的区别解析

    原文地址 http blog csdn net hkx1n article details 4313303 作用 为了避免同一个文件被include多次 C C 中有两种方式 一种是 ifndef方式 一种是 pragma once方式 在