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的编译器报错,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。

c/c++ 避免重复包含 pragma once 和 #ifndef 的区别相关推荐

  1. #pragma once与#ifndef的区别

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

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

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

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

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

  4. #pragma once与 #ifndef的区别

    2019独角兽企业重金招聘Python工程师标准>>> 为了避免同一个文件被include多次 1   #ifndef方式 2   #pragma once方式 在能够支持这两种方式 ...

  5. #pragma once与 #ifndef的区别 (转)

    http://www.cppblog.com/szhoftuncun/archive/2007/10/28/35356.html 为了避免同一个文件被include多次 1   #ifndef方式 2 ...

  6. #pragma once与#ifndef的区别?

    /* 2017-12-20 创建人:Ruo_Xiao */ 一.#pragma once 作用:只要在头文件的最开始加入这条指令就能够保证头文件被编译一次. 最先应用与MicroSoftware Vi ...

  7. 粗谈pragma once与 #ifndef的区别

    #ifnde不受编译器的任何限制: #pragma once不受一些较老的编译器支持,兼容性不够好

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

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

  9. 防止头文件重复包含之pragma once与#ifndef

    在我们自己编写 C/C++的头文件时,可能会忽略一点:用一些处理机制来避免头文件的重复包含,因为头文件的内容在预编译时是把头文件的内容完全拷贝到引入的地方替换头文件的包含命令,而包含的头文件可能有包含 ...

最新文章

  1. python mql4_可以转发文章不?老外用随机森林预测外汇分钟涨跌准确率高达85%。求高手用python重写。...
  2. python数据科学-数据预处理
  3. windows内核情景分析---进程线程2
  4. nginx服务器怎么配置文件,nginx服务器搭建和配置(nginx怎么搭配配置服务器)
  5. 中科院分区基础版和升级版究竟有何区别?
  6. 数组和集合的区别及定义方式
  7. vscode使用Setting Sync
  8. pycharm社区免费版如何创建Django项目
  9. MyEclipse 10破解教程
  10. veu-cli 3.0使用教程
  11. CDR2021安装教程 CorelDRAW 2021完整版下载
  12. excel的最大行数和列数
  13. PHP长字符串表示方法
  14. 微信上线支付分对标芝麻信用分,教你如何开通!
  15. 人民邮电报丨智链助力北大荒大米实现区块链全生命周期追溯
  16. 回头再说--英雄 汪峰
  17. 机器学习线性回归实践,波士顿房价预测,手写梯度下降
  18. Linux 下 find(文件查找)命令的用法总结
  19. 离线安装docker-compose
  20. IOS OC 多态(白话)

热门文章

  1. Go 语言编程 — panic 和 recover
  2. U-Boot移植教程之一:U-Boot分析与启动过程
  3. 二极管的反向恢复过程
  4. Eclipse Open J9:Eclipse OMR项目提供的开源JVM
  5. 使用soapUI代替WSDL2JAVA生成cxf HTTPS 客户端调用代码
  6. 让自己的主机成为证书颁发机构
  7. C#程序设计笔记(第九章)
  8. 团队作业6—《Spring_Four》团队项目系统设计改进与详细设计
  9. 直播内容不合规怎么办?智能AI为您解决审核难题
  10. 服务器负载均衡的基本功能和实现原理