【为什么】C++中的#pragma once是干什么,和#include guard区别

2023-11-18

一.

#pragma once是C和C++编程语言中的一个非标准但广泛支持的预处理指令,用于使当前源文件在单次编译中只被包含一次。它与#include guards有相同的作用,但有一些优点,如:代码更少,避免名称冲突,有时可以提高编译速度

代码例子:

// Foo.h 
#pragma once 
class Foo { };

这个指令告诉编译器只包含一次Foo.h文件,不管它被导入了多少次。它相当于一个#include guard,但避免了一些问题。请注意,#pragma once不是任何ISO C++标准的一部分,它是编译器特定的

二.

#include guard是C和C++编程语言中的一种特殊构造,用于避免处理#include指令时出现的重复包含问题。它的作用是确保编译器只处理一次某个文件,不管它被包含了多少次。

代码例子:

// Foo.h

#ifndef FOO_H_

#define FOO_H_

class Foo { };

#endif //FOO_H_

这个指令告诉编译器如果没有定义FOO_H_这个标识符,就定义它,并包含Foo类的代码。如果已经定义了FOO_H_,就跳过这个文件

FOO_H_是一个宏,它是通过#define FOO_H_语句定义的。这个语句告诉编译器,把FOO_H_替换为一个空值。这样,当编译器再次遇到#ifndef FOO_H_时,就会检查FOO_H_是否已经被替换过,从而判断是否需要包含Foo.h文件

三.区别

  • #include guard是一种标准的预处理指令,可以在所有符合标准的编译器和预处理器中工作。#pragma once是一种非标准的编译器特定指令,可能不被所有的编译器支持。
  • #include guard需要为每个文件定义一个唯一的标识符,而#pragma once不需要。#pragma once只需在文件开头写一行即可。
  • #include guard是通过检查文件内容来防止重复包含,而#pragma once是通过检查文件是否物理相同来防止重复包含。这意味着如果同一个文件在文件系统中有多个别名或拷贝,#pragma once可能会失效,而#include guard仍然可以工作。
  • #pragma once可以让编译器完全跳过已经包含过的文件,而不用再解析它们。这可能会提高编译速度和效率。但是一些编译器也可以对#include guard进行优化,使它们与#pragma once相当
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【为什么】C++中的#pragma once是干什么,和#include guard区别 的相关文章

随机推荐

  • 10种进阶方法让你快速测试端口连通性

    转载连接 介绍 Ping是Windows Linux和Unix系统下的一个检查网络连通性的命令工具 对于大部分互联网用户来说很实用 很方便 但是ping有个缺点 不能指定端口 如果源地址被设置禁ping 那么ping命令就形同虚设 为了弥补
  • Mysql教程(二):DDL学习

    Mysql教程 二 DDL学习 DDL Data Definition Language 数据定义语言 用来定义数据库对象 数据库 表 字段 1 DDL数据库操作 查询 查询所有数据库 SHOW DATABASES 查询当前数据库 SELE
  • 【华为OD】华为性格测试(综合测试)高分策略

    性格测试 综合测试 注意 1 性格测试非常重要 是一次否决制 18 个月有效期 所以态度一定要认真对待 不要随便乱选 2 做题原则 正向原则 积极乐观向上 3 时间为 25 30 分钟 会频繁出现重复选项重复出现的题目注意一致性 提示 1
  • 排列数组使得偶数在奇数的前面

    Name ReorderOddEven c Author 齐保元 Version Copyright Your copyright notice Description Hello World in C Ansi style include
  • 对js运算符“

    首先出个题 如图 假设对成长速度显示规定如下 成长速度为5显示1个箭头 成长速度为10显示2个箭头 成长速度为12显示3个箭头 成长速度为15显示4个箭头 其他都显示都显示0各箭头 用代码怎么实现 差一点的if else Js代码 var
  • 100天精通Python(基础篇)——第6天:标识符

    规则1 内容限定 限定只能使用 中文 英文 数字 下划线 注 不能以数字开头 规则2 大小写敏感 可以区分大小写 规则3 不可使用关键字 for while return等
  • (简单成功详细)CentOS 安装 node.js

    个人感觉比较好用的方法 目录 方法一 方法二 安装指定版本的nodejs并配置环境变量全局模块方法 方法一 1 安装yum sudo yum install epel release 2 安装nodejs sudo yum install
  • 我的2017年度技术回顾

    我为之前浪费的大把光阴后悔不已 如今正奋起直追 不知 为时可晚 较早是从事传统软件开发 主要以交付项目为主 后来慢慢转向互联网 属先知后觉那一类 一直从事Java软件研发管理工作 时下热门的小程序 大数据 人工智能 机器学习等接触很少 一方
  • volatile保证可见性,原理是什么

    VOLATILE 只保证可见性 Java多线程内存可见性 并不保证原子性 可见性 一个线程对共享变量的修改 更够及时的被其他线程看到 原子性 即不可再分了 不能分为多步操作 比如赋值或者return 比如 a 1 和 return a 这样
  • 使用本地Windows创建密钥连接GitHub时发现你的git根目录里没有.ssh文件夹怎么办?

    首先 你在桌面右击进入Git Bash 输入如下命令查看git配置中是否有自己的GitHub账号名和邮箱 git config list 一般你自己不设置是不会有的 那就自己在本地创建一个账号名和邮箱 引号中填写你的账号名 git conf
  • Python:Tornado框架之获取get和post的传参

    一 获取get方式传参 import tornado ioloop 导入tornado包 import tornado web class MainHandle tornado web RequestHandler def get self
  • number1(python)

    1抽 签 你的朋友提议玩一个游戏 将写有数字的 I个纸片放入口袋中 你可以从口袋中抽取 4 次纸 片 每次记下纸片上的数字后都将其放回口袋中 如果这 4 个数字的和是m 就是你赢 否 则就是你的朋友赢 你挑战了好几回 结果一次也没赢过 于是
  • 梦幻手游服务器维护摆摊公示时间,梦幻手游5月4日维护公告 摆摊交易优化

    亲爱的玩家朋友 为保证服务器的运行稳定和服务质量 梦幻西游 手游所有服务器将于2016年5月4日8 00停机 进行维护工作 预计维护时间为8 00 9 00 如果在预定时间内无法完成维护内容 开机时间也将继续顺延 请各位玩家相互转告 并提前
  • wm命令详解

    usage wm subcommand options wm size reset WxH WdpxHdp wm density reset DENSITY wm overscan reset LEFT TOP RIGHT BOTTOM w
  • Ubuntu操作系统学习笔记之安装和配置Apache2

    在Ubuntu中安装apache 安装指令 sudo apt get install apache2 安装结束后 产生的启动和停止文件是 etc init d apache2 启动 sudo apache2ctl k start 停止 su
  • C++的sort函数对于vector排序

    对于vector
  • llvm 介绍有用的网站

    LLVM笔记 7 指令的side effect LLVM笔记 7 指令的side effect Five100Miles 博客园 LLVM每日谈之十八 GEP Instruction的几点总结 LLVM每日谈之十八 GEP Instruct
  • 用docker搭建公司内部的gitlab 和 wiki

    docker run name gitlab d link gitlab postgresql postgresql link gitlab redis redisio publish 10022 22 publish 10080 80 e
  • 使用jasypt为springboot配置文件加密

    使用jasypt为配置文件加密 配置项明文可能出现的问题 先看一份典型的配置文件 配置MySQL数据库连接 spring datasource driver class name com mysql jdbc Driver spring d
  • 【为什么】C++中的#pragma once是干什么,和#include guard区别

    一 pragma once是C和C 编程语言中的一个非标准但广泛支持的预处理指令 用于使当前源文件在单次编译中只被包含一次 它与 include guards有相同的作用 但有一些优点 如 代码更少 避免名称冲突 有时可以提高编译速度 代码