1.#pragmaonce这个宏有什么作用?
为了避免同一个头文件被包含(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的编译器报错,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。
选择哪种方式,应该在了解两种方式的情况下,视具体情况而定。只要有一个合理的约定来避开缺点,我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了,应当由程序员自己或者小范围内的开发规范来搞定。

#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况
#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。
方式一由语言支持所以移植性好,方式二 可以避免名字冲突
———————————————
版权声明:本文为CSDN博主「老樊Lu码」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fanyun_01/article/details/77413992

#pragma once 用法总结相关推荐

  1. #pragma pack 用法详解

    #pragma pack 用法详解 pack为struct.union和class等的成员对齐指定字节边界,与编译选项(属性 -> 配置属性 -> C/C++ ->代码生成 -> ...

  2. #pragma的用法

    #pragma的用法 在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C ...

  3. c语言 pragma指令,C语言#pragma指令用法

    引导语:在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.以下是百分网小编分享给大家的C语言#pragma指令用法,欢迎阅读! # ...

  4. SQLite指南(5) - PRAGMA命令用法(完整)

    如若转载,请加上本文链接,以示尊重个人劳动,谢谢. PRAGMA语句是SQLITE数据的SQL扩展,是它独有的特性,主要用于修改SQLITE库或者内数据查询的操作.它采用与SELECT.INSERT等 ...

  5. 预处理指令pragma常见用法集锦(#pragma once、#pragma comment和#pragma warning)

    #pragma once: 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,避免文件被重复包含. ********************************* ...

  6. 进程共享变量#pragma data_seg用法

    #pragma data_seg介绍 用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为: #pragma data_seg ("shareddata" ...

  7. [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法

    想必很多人都看过"头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用".但是是否能理解"被重复引用"是什么意思?头文件被重复 ...

  8. C++的友元函数,友元类及#pragma once的作用

    把代码都放最后吧 友元函数的作用: 可以访问该类的私有属性 但在类的外面定义的时候没有"类::" 所以该友元函数不属于该类 友元函数的意义: C++友元函数_Bussy的博客-CS ...

  9. dsp 中DATA_SECTION用法

    DSP中pragma 的用法 ti的帮助文档里是这么讲的: The DATA_SECTION pragma allocates space for the symbol in a section ca ...

  10. #pragma once和#ifndef指令总结

    在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性(个人觉得这里二义性提的有点问题,觉得下面的补充可能理解好一些,有更好的解释可以帮我解答下哦.),通常有两种方式-- ...

最新文章

  1. DIY强大的虚拟化环境-技术可行性部分
  2. 接口里面的方法都是抽象方法吗_正确的敷面膜方法 你真的都掌握了吗
  3. python程序加密license_怎么解决pycharm license Acti的方法
  4. 如何让采集的数据比原创还要原创!
  5. 商汤科技-数据运维工程师-提前批笔试题目汇总
  6. php有多少魔术方法,PHP常用的几个魔术方法
  7. 剑指OFFER之用两个栈实现队列(九度OJ1512)
  8. LeetCode 200. Number of Islands
  9. 面试官的几句话,差点让我挂在HTTPS上
  10. json oracle 导入,JsonToOracle-Json导入Oracle工具下载 v2.0 官方版 - 安下载
  11. Python 电子书下载列表
  12. 银联网关支付接口规范
  13. linux+psp+模拟器下载,PSP1.5模拟器全教程+最新版本下载(最终版)
  14. 如何查找Oracle数据库安全漏洞的补丁
  15. 姑娘美丽人体日志博客_60个美丽诱人的博客设计
  16. 计算机专业选择银行必须知道的20个问题
  17. pd对焦速度_自动对焦速度是由相机还是镜头决定的?
  18. EasyExcel删除模版Sheet页
  19. centos 安装yapi 详细教程
  20. Win10快捷键,管多

热门文章

  1. 请和我一起学习机器学习算法(高斯混合聚类)
  2. Bootstrap 导航/滑动门(nav)
  3. 基于rietveld 搭建 codereview平台 选型和部署篇(一)
  4. 小米手机连接MAC电脑
  5. STM32F407读取ADS1115数据
  6. python 显著性检验_Python SciPy 统计显著性检验(Statistical Significance Tests)
  7. html手机陀螺仪,陀螺仪MEMS - 详解冷门但很重要的手机陀螺仪
  8. 计算机多人远程桌面连接,配置网络:实现多个远程桌面连接
  9. css兼容360浏览器极速,CSS hack 360浏览器 极速模式与兼容模式
  10. Win10电脑卡顿原因和解决方法