1. #pragmaonce这个宏有什么作用?
  • 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。
  • 在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。
  1. 两者的使用方式有何区别?
 #ifndef  __SOMEFILE_H__#define   __SOMEFILE_H__... ... // 声明、定义语句#endif
#pragmaonce... ... // 声明、定义语句
  1. 两者各有何特点?
  • #ifndef的方式受C/C++语言标准支持。它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。
  • 当然,缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。
  • 由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。
  • #pragma once 一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。
  • 你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。
  • 其好处是,你不必再担心宏名冲突了,当然也就不会出现宏名冲突引发的奇怪问题。大型项目的编译速度也因此提高了一些。
  • 对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名冲突引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。
  • 另外,这种方式不支持跨平台!
  1. 两者之间有什么联系?
  • #pragma once 方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受C/C++语言标准的支持,不受编译器的任何限制;
  • 而#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。
  • 一般而言,当程序员听到这样的话,都会选择#ifndef方式,为了努力使得自己的代码“存活”时间更久,通常宁愿降低一些编译性能,这是程序员的个性,当然这是题外话啦。

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

   #pragma once#ifndef __SOMEFILE_H__#define __SOMEFILE_H__... ... // 声明、定义语句#endif
  • 看起来似乎是想兼有两者的优点。不过只要使用了#ifndef就会有宏名冲突的危险,也无法避免不支持#pragma once的编译器报错,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。
  • 选择哪种方式,应该在了解两种方式的情况下,视具体情况而定。只要有一个合理的约定来避开缺点,我认为哪种方式都是可以接受的。而这个已经不是标准或者编译器的责任了,应当由程序员自己或者小范围内的开发规范来搞定。

C/C++编程:#pragma once用法总结相关推荐

  1. #pragma的用法

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

  2. python多态的例子_Python编程之多态用法实例详解

    本文实例讲述了Python编程之多态用法.分享给大家供大家参考.具体分析如下: 什么是多态?顾名思义,多态就是多种表现形态的意思.它是一种机制.一种能力,而非某个关键字.它在类的继承中得以实现,在类的 ...

  3. VTK:可编程字形过滤器用法实战

    VTK:可编程字形过滤器用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCamera.h> ...

  4. #pragma pack 用法详解

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

  5. 单片机编程软件很简单(五),keil单片机编程软件变量用法(下)

    对于单片机编程软件,想必大家均有所了解.针对单片机编程软件,小编曾对keil.IAR予以介绍.本文对于单片机编程软件的讲解,同样基于keil.本文中,将介绍keil单片机编程软件变量用法下篇.如果你对 ...

  6. 模板编程中typename用法

    模板编程中typename用法 文章目录 模板编程中typename用法 typename的常规用法 typename的第二个用法:修饰类型 typename使用规则 typename的常规用法 ty ...

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

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

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

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

  9. 三十天学不会TCP,UDP/IP网络编程 - RST的用法

    不知不觉也写了这么多了,继续我的自己的推广大业~完整版可以去gitbook(https://rogerzhu.gitbooks.io/-tcp-udp-ip/content/)看到. 如果对和程序员有 ...

  10. 高并发编程-Thread#interrupt用法及源码分析

    文章目录 官网 方法&源码 void interrupt() ` boolean isInterrupted()` vs `static boolean interrupted()` 方法&a ...

最新文章

  1. redisCommand接口的用法--利用hiredis库获取MGET命令的结果的坑!
  2. 【Android 逆向】Android 逆向通用工具开发 ( 网络模块开发 | SOCKET 网络套接字初始化 | 读取远程端 “Android 模拟器“ 信息 | 向远程端写出数据 )
  3. Python 字符串处理(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
  4. SQL Server表名为添加中括号[]执行出错
  5. TREX搜索的执行最后也是通过HTTP call来完成的
  6. android脚本快捷方式,Android:如何创建主屏幕快捷方式启动shell脚本?
  7. svn 命令行_小型工作室搭建SVN经验
  8. java io图_JAVA IO流结构图
  9. 关于指针初始化的问题 - 回复下雨天2
  10. 贪吃蛇游戏设计算法及创新
  11. 《高斯牛顿优化算法--第一讲》原理推导
  12. 安装软件提示计算机管理员权限,win10安装软件需要管理员权限的处理办法|win10装软件提示error launching installer如何处理?...
  13. 基于ssm汽车租赁管理系统的设计与实现
  14. 需要在计算机安装msxml版本,win7 Office2010提示安装MSXML版本6.10.1129.0怎么办
  15. OCCT命令集1(速查笔记)
  16. 推荐一个不错的在线文档分享网站-Scribd,陆续分享我的电子藏书
  17. 开始Python的新手教程
  18. 消息称,用户已收到华为 HarmonyOS 2.0 开发者公测版推送
  19. 8.1 子模块分析之IDMAC
  20. PC突然开始只能输入繁体,那可能是这个设置出了问题

热门文章

  1. 如何让html页面缩小时不打乱,如何让表格快速打乱
  2. EtherCAT工业以太网的主要特点
  3. Python-pandas-Excel排序、筛选
  4. MOFs/COFs单体 COFs单体 光电材料中间体的应用
  5. 财务结账方法:账结法和表结法
  6. C语言链表的简单的尾插法
  7. 通过3dmax将max文件导出为unity3d可用的带贴图的fbx文件
  8. Excel表头怎么设计?这里有超全面的表头设计方法!一分钟可学会
  9. python爬虫爬网页源码保存到本地_python爬虫网页图片并保存到本地
  10. java 全量_七、通过java代码实现增量、全量索引