正在入门驱动编程,遇到一个小问题,如下详细解释。

原文链接:#pragma once 与 #ifndef 解析

http://www.cnblogs.com/hokyhu/archive/2009/03/30/1425604.html

为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。
    方式一:

#ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 声明、定义语句
    #endif

方式二:

#pragma once
    ... ... // 声明、定义语句

#ifndef的方式受C/C++语言标准支持。它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。
    当然,缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,编译器却硬说找不到声明的状况——这种情况有时非常让人抓狂。
    由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。

#pragma once一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。
    其好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。大型项目的编译速度也因此提高了一些。
    对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。

#pragma once方式产生于#ifndef之后,因此很多人可能甚至没有听说过。目前看来#ifndef更受到推崇。因为#ifndef受C/C++语言标准的支 持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。一般而言,当程序员听到这样的话,都会选 择#ifndef方式,为了努力使得自己的代码“存活”时间更久,通常宁愿降低一些编译性能,这是程序员的个性,当然这是题外话啦。

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

#pragma once
    #ifndef __SOMEFILE_H__
    #define __SOMEFILE_H__
    ... ... // 声明、定义语句
    #endif

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

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

btw:我看到GNU的一些讨论似乎是打算在GCC 3.4(及其以后?)的版本取消对#pragma once的支持。不过事实上,我手上的GCC 3.4.2和GCC 4.1.1仍然支持#pragma once,甚至没有deprecation warning,倒是GCC2.95会对#pragma once提出warning。
    VC6及其以后版本亦提供对#pragma once方式的支持,这一特性应该基本稳定下来了。

转载于:https://www.cnblogs.com/dhf327/p/4432360.html

#pragma once 与 #ifndef 解析(转载)相关推荐

  1. 【c/c++】#pragma once 与 #ifndef 的区别解析

    转载 [c/c++]#pragma once 与 #ifndef 的区别解析 2016-03-03 10:03:04 小明6号 阅读数 5092更多 分类专栏: [c/c++] 查看全文 http:/ ...

  2. #pragma once 和 #ifndef ... #define ... #endif 的区别【转载】

    在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作. 1. #pragma message 指令 message能够在编译消息输出窗口中输出相应的消 ...

  3. #pragma once与#ifndef的区别

    #pragma once 和 #ifdef 都可以避免同一个文件被include多次,但二者的含义略有不同. 1. #pragma once方式 1.1. 使用方法 #pragma once// co ...

  4. #pragma指令与#ifndef指令

    #pragma指令与#ifndef指令 在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性,通常有两种方式-- 第一种是#ifndef指令防止代码块重复引用,比如说 # ...

  5. #pragma once与 #ifndef的区别为了避免同一个文件被include多次

    #pragma once与 #ifndef的区别为了避免同一个文件被include多次 1   #ifndef方式 2   #pragma once方式 在能够支持这两种方式的编译器上,二者并没有太大 ...

  6. Android60运行时权限处理完全解析(转载)

    Android60运行时权限处理完全解析 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的 ...

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

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

  8. 【转载】#pragma once与#ifndef #define #endif的区别

    一.相同点         两者的共同点都是为了避免同一个文件被 include 多次,但是 #ifndef #define #endif 不只有这个作用.  在能够支持这两种方式的编译器上,二者并没 ...

  9. #pragma once与#ifndef

    在C/C++中,在使用预编译指令#include的时候,为了防止重复引用造成二义性的两种方法. #ifndef 它不光可以保证同一份文件不会被包含两次,也能够保证不同文件完全相同的内容不会被包含两次. ...

最新文章

  1. 介绍最新大片——程序员必看!
  2. 3维DEMO: 抽奖圆盘
  3. 广域线路打环测试步骤
  4. python2 unicode编码_如何优雅解决python2.x的unicode编码优雅输出?
  5. 天池 在线编程 两句话中的不常见单词(哈希计数)
  6. linux db2在线备份,DB2 pureScale在线备份恢复实例
  7. java 怎么为泛型参数赋值_Java泛型讲解
  8. MySQL-----改
  9. ubuntu如何完全卸载和安装 Java及android环境
  10. memcache集群服务:memagent配置使用
  11. 计算机硬件参数的工具软件,电脑硬件参数修改工具
  12. 数据结构-01-图解后缀表达式值计算方式
  13. 【算法】泽勒的一致性
  14. java 1 20内奇数的乘积_计算所有奇数的乘积
  15. 2022最新二开微交易系统股票配资理财系统源码+附教程
  16. 苹果电脑上好用的五款文档文字编辑处理工具
  17. OpenAI ChatGPT 接入微信,与AI互动
  18. bug[TypeError:Failed to execute ‘fetch‘ on ‘Window‘: Request with GET/HEAD method cannot have body.]
  19. 基于Keras的LSTM多变量时间序列预测(北京PM2.5数据集pollution.csv)
  20. “北上广深”的“收租婆”角色什么时候能够减少?

热门文章

  1. cent os 7 mysql_centos – 百胜:Cent OS 7中没有包mysql-server
  2. java抓取网页数据_Golang丨Java丨Python爬虫实战—Boss直聘网站数据抓取
  3. php xml 留言板,php xml留言板 xml存储数据的简单例子
  4. Java ArrayList的Array,Array的ArrayList
  5. jsp el 表达式_JSP表达式语言– JSP EL示例教程
  6. 开课吧:一文读懂算法工程师大致分类与技术要求
  7. AI和机器学习对云计算的安全有何影响?
  8. 爬虫调用百度翻译API
  9. 4G网络建设近尾声 SDN/NFV是5G网络创新关键
  10. Centos6.5搭建mongodb分片