#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 的区别解析 的相关文章

  • 多光谱遥感分类

    多光谱遥感分类 数据集制作 SAE调参 预测 数据集制作 本次实验是多分类 9分类 训练 验证 测试数据来自人工标记的区域 用ArcGIS生成每个点的X Y地理坐标后算出像素的相对位置 data x round data X 331718

随机推荐

  • 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方式 在