当前位置:首页 > 公众号精选 > 嵌入式大杂烩
[导读]关注「嵌入式大杂烩」,选择「星标公众号」一起进步!大家好,我是ZhengN。本次给大家分享一个C/C的小知识——#pragmaonce。我之前也没用过#pragmaonce,直到看到同事的代码有用到,所以去了解了一下。分享一篇博文:❝https://blog.csdn.net/f...

关注「嵌入式大杂烩」,选择「星标公众号」一起进步!

大家好,我是ZhengN。本次给大家分享一个C/C 的小知识——#pragma once

我之前也没用过#pragma once,直到看到同事的代码有用到,所以去了解了一下。分享一篇博文:

https://blog.csdn.net/fanyun_01/article/details/77413992

1、#pragma once有什么作用?

为了避免同一个头文件被包含(include)多次,C/C 中有两种宏实现方式:一种是#ifndef方式另一种是#pragma once方式

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

2、两者的使用方式有何区别?

示例代码如下:

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

//方式二:
#pragmaonce
 ... ... // 声明、定义语句

3、两者各有何特点?

(1)#ifndef

#ifndef的方式受C/C 语言标准支持。它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。

当然,缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。

由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。

(2)#pragma once

#pragma once 一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。

你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。

其好处是,你不必再担心宏名冲突了,当然也就不会出现宏名冲突引发的奇怪问题。大型项目的编译速度也因此提高了一些。

对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名冲突引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。

另外,这种方式不支持跨平台!

4、两者之间有什么联系?

#pragma once 方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受C/C 语言标准的支持,不受编译器的任何限制;

#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。

一般而言,当程序员听到这样的话,都会选择#ifndef方式,为了努力使得自己的代码“存活”时间更久,通常宁愿降低一些编译性能,这是程序员的个性,当然这是题外话啦。

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

#pragma once
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__

... ... // 声明、定义语句

#endif
总结:

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

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

为了避免同一个文件被include多次:

1、#ifndef方式 

2、#pragma once方式

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

方式一:

#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif

方式二:

#pragma once
... ... // 一些声明语句
#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。

#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。

对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

方式一由语言支持所以移植性好,方式二 可以避免名字冲突。

本文来源网络版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

往期干货:

往期推荐



嵌入式项目生成器,了解一下!

一个清晰的LCD驱动编写思路(附代码分析)

RT-Thread和Freertos的区别?

程序如何运行?编译、链接、装入?


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

印度海得拉巴和马萨诸塞州波士顿2022年4月20日 /美通社/ -- 全球领先的生命科学组织数据和分析提供商Excelra宣布,对价值和证据领域快速发展的年轻技术公...

关键字: ce

北京2022年4月11日 /美通社/ -- 亚马逊云科技助力数据服务和管理平台提供商Kyligence构建企业级云原生大数据OLAP解决方案,使其云上交付速度提升30%。同时,通过加入“ISV(独立软件供应商)加速赢计划...

关键字: ce ge 进程

(全球TMT2022年4月11日讯)亚马逊云科技助力数据服务和管理平台提供商Kyligence构建企业级云原生大数据OLAP解决方案,使其云上交付速度提升30%。同时,通过加入“ISV(独立软件供应商)加速赢计划”,K...

关键字: 亚马逊 ge ce

(全球TMT2022年4月7日讯)为Microsoft Dynamics 365和Salesforce提供云端配置、价格、报价(CPQ)和文档自动化软件的供应商Experlogix宣布与Microsoft Dynami...

关键字: ce Dynamics logix

价值9.02亿美元的OpenSpace在建筑和房地产领域继续得到对其技术的广泛采用,现已获取了1万多个工地现场超过6.5亿平米面积的影像...

关键字: pen ce

(全球TMT2022年2月21日讯)爱立信IoT Accelerator推出一款可靠、安全的蜂窝物联网平台,使全球电信运营商(CSP)和企业能够在数千万台设备上拓展其物联网业务。爱立信发布IoT Accelerator...

关键字: ce 蜂窝物联网 物联网平台

(全球TMT2022年2月22日讯)穆巴达拉投资公司(Mubadala Investment Company,简称“穆巴达拉”)以领投方身份完成了对总部位于新加坡的数据中心提供商Princeton Digital Gr...

关键字: Digital Group ce

英国伦敦和印度海得拉巴2022年2月10日 /美通社/ -- 数据科学和分析领导者Excelra 与人工智能先驱X-Chem之间的全新合作将加速临床前药物发现,帮助...

关键字: ce

灵活工作安排和“大辞职”潮无意间提高网络风险,值此之际,人工智能将加强安全团队 英国剑桥2022年1月28日 /美通社/ -- 网络安全人工智...

关键字: ce

(全球TMT2022年1月29日讯)网络安全人工智能领域的全球领导者Darktrace宣布,其自主响应技术现将在端点上采取行动 -- 完善Darktrace Antigena产品系列,该产品系列已覆盖SaaS应用程序、...

关键字: 人工智能 网络安全 ce
关闭
关闭