#ifndef vs #pragma once, 哪个更好用?

2024-04-19 08:28
文章标签 vs 更好 ifndef pragma

本文主要是介绍#ifndef vs #pragma once, 哪个更好用?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

相关文章系列

预处理 #pragma 命令详解-CSDN博客

目录

1.引用

2.#pragma once

3.#ifndef

4.总结


1.引用

        在C++编程中,头文件守卫(Header Guard)是一种防止头文件内容在同一编译单元中被多次包含的技术。这种重复包含可能导致编译错误,如类型重定义或变量多重声明。为了解决这个问题,开发者通常使用预处理指令来确保头文件只被包含一次。最常见的两种方法是使用#ifndef/#define/#endif宏(也称为传统的头文件守卫)和#pragma once指令。

2.#pragma once

        #pragma once 是一个非标准但被广泛支持的预处理符号, 其主要作用是防止文件重复引入问题,它一般由编译器保证,同一文件不会被包含多次。这里的“同一文件”是指物理上的一个文件,而不是指内容相同的两个文件。这种方式比 #ifndef 更加简洁和直观,但是它不是标准的 C++ 语法,可能不被所有编译器支持,移植型差,有些编译器支持,有些编译器不支持,比如:gcc,vs 编译器支持,bcc 编译器不支持。使用 #pragma 的方式非常简单,只需要在头文件的开头添加一行 #pragma once 即可。例如:

#pragma once

3.#ifndef

        #ifndef 是一个标准的预处理指令,它使用条件编译的方式来防止头文件被重复包含。当编译器编译到 #ifndef 指令时,它会检查这个宏是否已经被定义,如果没有被定义,则编译该文件并定义该宏。如果已被定义,则跳过该文件的编译。这种方式比较通用,可以在所有的 C++ 编译器中使用,但是需要手动定义宏,稍微有些繁琐。#ifndef 是 C 语言相关的,通过宏定义避免文件多次编译。所以在所有支持C/C++ 语言的编译器上都是有效的。跨平台移植性好。使用 #ifndef 的方式需要定义一个宏,通常使用头文件的名称作为宏的名称。例如:

#ifndef _MY_TEST_H_
#define _MY_TEST_H_// 头文件内容#endif // _MY_TEST_H_

        在这个例子中,_MY_TEST_H_是一个宏,如果它没有被定义,则编译头文件并定义该宏。如果已经被定义,则跳过头文件的编译。

4.总结

        #pragma once 和 #ifndef 都是用于防止头文件被重复包含的预处理指令,但它们的实现方式略有不同。下面是它们的对比:

#pragma once 依赖于编译器,可移植性较差

#pragma once 是一个非标准的预处理指令,而 #ifndef 是一个标准的预处理指令。#ifndef…#define…#endif 是 C/C++ 标准中的一部分,支持 C/C++ 的编译器都能使用,可移植性更高。

使用 #pragma once 的代码简洁

#pragma once 更加简洁和直观,但是不是标准的 C++ 语法,可能不被所有编译器支持。#ifndef 是标准的 C++ 语法,可以在所有的编译器中使用,但是需要手动定义宏。

性能区别

使用 #ifndef,编译器每次看到 #include 这个文件都需要读入文件,解析代码,效率低
而使用 #pragma once 是编译器特有指令,根本不会重复打开文件, 可以直接在编译器内部进行文件的检查,大大提高效率。

        综合上述,在选择使用#ifndef/#define/#endif宏还是#pragma once时,应该考虑项目的具体需求和目标平台。如果你的项目需要在多种编译器上工作,特别是包括一些老旧或特定的编译器,那么传统的#ifndef守卫可能是更安全的选择。然而,如果你的项目主要针对现代编译器,并且你希望代码更简洁、易维护,那么#pragma once可能是一个更好的选择。

        无论选择哪种方法,重要的是保持一致性和清晰性。确保你的项目中所有头文件都使用相同的守卫方法,并且守卫的命名清晰明了,这样可以最大限度地减少混淆和错误的可能性。

这篇关于#ifndef vs #pragma once, 哪个更好用?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917035

相关文章

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

html记账本改写:数据重新布局,更好用了,没有localStorage保存版本

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8"><title>htm记账本</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid bla

解决服务器VS Code中Jupyter突然崩溃的问题

问题 本来在服务器Anaconda的Python环境里装其他的包,装完了想在Jupyter里写代码验证一下有没有装好,一运行发现Jupyter崩溃了!?报错如下所示 Failed to start the Kernel. ImportError: /home/hujh/anaconda3/envs/mia/lib/python3.12/lib-dynload/_sqlite3.cpython-

VSC++: 括号对称比较

括号的使用规则:大括号,中括号,小括号{[()]};中括号,小括号[()];小括号();大括号、中括号、小括号、中括号、小括号、大括号{[()][()]};大括号,中括号,小括号,小括号{[(())]};大括号,中括号,小括号,小括号{[()()]};小括号不能嵌套,小括号可连续使用。 {[]}、{()}、([])、({})、[{}]、{}、[]、{[}]、[(])都属非法。 char aa[

【MobaXterm 远程连接工具】Windows下有没有xshell的更好的替代品?

每次间隔一段时间,xshell 总是提醒需要更新,很烦,点更新又没有用。 xshell 官方下载地址: https://xshell.en.softonic.com/ 本文要隆重推出一款集万千于一身的全能型终端神器——MobaXterm!这款神器是我师傅介绍给我的,在我第一次使用它的时候,就深深爱上它了,真的是相见恨晚,从此一发不不可收拾,自己电脑,公司电脑全部都安上了这款神器。 先说说这款

小渠道应该如何深度优化,才能达到更好的效果呢?

本篇给大家分享的是医疗行业搜索小渠道优化案例,一个月时间成本降低80%看看他是如何用做到的。 我所说的小渠道主要指的是搜狗,神马,360三个渠道。 很多时候大家只注重大搜渠道和信息流渠道,毕竟这些渠道消耗比较大,整体的转化量也比较大,是我们重点需要关注的,很少有去精细化运营小渠道的。的确小渠道不能雪中送炭,但是往往能够锦上添花,关键时刻,小渠道是降低总成本的有效利器。 那么小渠道应该如何

月考成绩查询哪个软件更好用?

老师,这个职业总是伴随着无尽的忙碌,是时候该为我们这些辛勤的园丁减轻一些负担了,科技的便利性为我们提供了许多解决方案。易查分小程序就是一个很好的例子,能够帮助老师们在成绩管理上实现高效与便捷。 开学的第一个月,月考成绩的发布无疑是老师们的一项重要任务。用易查分,老师们可以轻松发布考试成绩。这个平台的设计非常人性化,操作简单,只需几步设置,成绩就能安全、准确地发布给每一位学生。家长和学生也

Apache Kylin VS Apache Doris全方位对比

1 系统架构 1.1 What is Kylin1.2 What is Doris2 数据模型 2.1 Kylin的聚合模型2.2 Doris的聚合模型2.3 Kylin Cuboid VS Doris RollUp2.4 Doris的明细模型3 存储引擎4 数据导入5 查询6 精确去重7 元数据8 高性能9 高可用10 可维护性 10.1 部署10.2 运维10.3 客服11 易用性 11.1

vs环境下C++dll生成和使用

动态库和静态库: 动态库:全名动态链接库,用于将你的函数封装,让别人只能调用,不能看你的实现代码。由引入库和dll组成:引入库包含导出的函数和变量名,dll包含实际的函数和数据,运行时加载访问dll文件。  Windows API中的所有函数都封装在dll里面,最重要的三个: Kernel32.dll:包含管理内存、进程和线程的各个函数。User32.dll:包含用于执行用户界面任务,如窗口和