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

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

1 #ifndef方式
2 #pragma once方式

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

#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif方式二:#pragma once
... ... // 一些声明语句#ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况#pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,重复包含更容易被发现并修正。

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

#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. 经济独立,是你最大的底气
  2. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法
  3. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(配置数据点显示)实战
  4. 谷歌发布 Android 8.1 首个开发者预览版,优化内存效率
  5. SDWebImage 最新版详解
  6. Android之用adb命令快速获取手机IP方法总结
  7. 第二阶段冲刺10天 第六天
  8. PIP scrapydo时报错ERROR: Command errored out with exit status 1: python setup.py egg_info Check the log
  9. 8 -- 深入使用Spring -- 5... Spring 3.1 新增的缓存机制
  10. UML/ROSE学习笔记系列二:UML的概念模型
  11. 背包问题 装箱问题 货盘装填问题 区别
  12. JS - 字符串截取方法汇总(slice、substring、substr等)
  13. css背景透明度影响字体--实现背景透明字体不透明
  14. JEESZ分布式框架简介---技术介绍文档
  15. 微信支付申请相关问题
  16. Beautifully crafted open source icons
  17. 路由器动态ip获取不到的处理办法
  18. Python WindowsError
  19. ajax提交多个form表单
  20. RFID隧道安全管理方案

热门文章

  1. linux运行海康的sdk,海康摄像头SDK在Linux、windows下的兼容问题(二)已解决
  2. t3服务器一登录就运行时错误,用友T3软件登陆系统管理提示运行时错误3709
  3. HDU 3709 平衡数 数位dp(Java版)
  4. c语言setw,在C++中,setw(int n)
  5. Java 拾遗补阙 ----- 数据类型
  6. 用741运算放大器搭建RC正弦振荡器:文氏电桥振荡电路
  7. 简单的js在html页面打印机,在javaScript中如何连接打印机
  8. 2020-1-7(169)
  9. 路由器的下一跳计算(网关)
  10. Azure 安全网络篇 - DMZ 区域设计实践