#pragma once和#ifndef的区别

2023-11-13

转载自“百度百科”

#pragma once 和 #ifndef的区别


    #pragma once和#ifdef都是可以避免同一个文件被include多次。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。


1. #pragma once方式


        这个是编译器相关,就是说在这个编译系统上能用,但是在其他编译系统,不一定行,也就是说移植型差。不过现在基本上已经是每个编译器都有这个定义了。编译器提供保证,同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。于是不必再费劲想个宏名了,当然也就可以避免宏的名字冲突问题了。缺点:如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。

// 看看VC自带的Stdarg.h头文件中是怎么使用#pragma once的 
// 毕竟微软的东西权威嘛 - -|| 
//  
 
#if     _MSC_VER > 1000 
#pragma once 
#endif  

#ifndef _INC_STDARG 
#define _INC_STDARG  

#include <vadefs.h> 
 
#define va_start _crt_va_start 
#define va_arg _crt_va_arg 
#define va_end _crt_va_end  

#endif  /* _INC_STDARG */

此时只需要注意以下三行代码:

#if     _MSC_VER > 1000 
#pragma once 
#endif

其中_MSC_VER宏是由微软编译器指定的,表示编译器的版本号。可以看到,在宏_MSC_VER的值小于1000(VC5.0)时,它对 #pragma once 是不支持的。


2. #ifndef方式
这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的。如果写的程序要跨平台,最好使用这种方式。#ifndef由语言支持,移植性好。它依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。另外,为了保证不同头文件中的宏名不冲突,故采取类似于_ABC_H_的取名方式。其中,abc.h为当前头文件名。缺点:如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。但这个缺点恰恰是我们可以利用的优点,#ifndef方式可以通过前面介绍的特殊的宏的取名方式来避免名称冲突问题,于是其缺点也就不复存在了,进而#ifndef方式就更常用了。
还看Stdarg.h头文件,这个头文件里面不仅使用了#pragma once方式而且使用了#ifndef方式来保证该头文件不被多次include.

#ifndef _INC_STDARG 
#define _INC_STDARG  

// ………… 
 
#endif  /* _INC_STDARG */


3. 总结
    ·性能上的区别


       使用 #ifndef 的话,编译器每次看到#include这个文件都需要读入文件,解析代码;

而使用#pragma once 编译器根本不会重复打开文件, 大大提高了效率。


·编码风格上的区别


       使用#pragma once的代码简洁,重要的是它避免了头文件标号(如_myheader_h_)的 重定义或者 #endif 包含范围错误的情况。


·语意上的区别


       #pragma once是针对文件的,它告诉编译器,本文件只编译一次。
       #ifndef…#define…#endif 只是针对文件中的某一个标号而言的,它能防止三个指令间包含的内容的重复性处理。就这一点而言,后者更灵活。

可移植性方面


        #pragma once是微软的开发工具中所使用的,如 msvc 等工具可以完好的支持;
        #ifndef #define #endif是C++标准里面的一部分,对于任何完好支持c/c++的编译器都能使用。显而易见,后者的可移植性更高。

转载于:https://blog.51cto.com/10739786/1730827

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#pragma once和#ifndef的区别 的相关文章

  • Quartz.NET简明示例

    下面是一个 Quartz NET 的简单例子 初始化调度器工厂 ISchedulerFactory sf new StdSchedulerFactory 获取默认调度器 IScheduler scheduler sf GetSchedule
  • Linux 反引号、单引号、双引号简析

    文章目录 一 引号的作用 二 反引号 三 单引号 四 双引号 五 引号解释顺序 一 引号的作用 1 将多个因为空格或者回车等分隔符隔开的字符串合在一起 避免被命令行解析分开 例如 a b c 是一个字符串 而不会像 a b c 这样会被解析
  • 6.基于STM32C8T6的四旋翼无人机的飞控制作----实践操作1,AD电路板绘制-前期准备

    飞控的各种芯片是焊接在电路板上的 电路板是各种传感器和接口的载体 电路板的设计过程也是极其考验耐心和仔细程度的 在大公司里都是每个部门负责其中的一部分工作 如原理图设计 布局布线 测试等等 在小公司和大学生的设计中 经常需要一个人走完全部的
  • 【Linux杂学】CMake:编写 CMakeLists

    CMake官网 掌握CMake 1 变量 CMake 变量名称区分大小写 且只能包含字母数字字符和下划线 CMAKE 变量 存储均为字符串 是CMake 自定义变量 命名应避开 set 可设变量值 第一参数是变量名 其余参数是值 多个参数被
  • Kylin 大数据下的OLAP解决方案和行业典型应用

    最近工作中应用到了 Kylin 因此调研了 Kylin的原理和行业应用 本文参考了官网和众多其他公司中 Kylin的应用案例 文末给出了出处 希望对大家有帮助 Apache Kylin的原理和技术架构 Apache Kylin 从数据仓库中
  • 火狐浏览器关闭百度热榜(屏蔽网站特定元素)

    2023 1 26更新 火狐浏览器不能下载 uBlock Origin 解决方法 https github com AdguardTeam AdguardBrowserExtension releases How to install be
  • 一、voc数据集按比例划分train、val

    下载的voc数据集 images annotations 经下代码 按比例划分成 只需要修改中文批注部分路 import os import sys import random import shutil if name main trai
  • Geforce 错误代码 ERROR CODE:0x0003问题方法

    笔者在360驱动大师安装了geforce驱动 打开geforce遇到报错0x0003 重启和重装都无效 解决办法是到nvidia官网重新安装了官网的geforce驱动 然后就能打开了
  • ARP协议

    一 ARP协议的简介 1 在网络通讯时 源主机的应用程序只知道目的主机的IP地址和端口号 却不知道目的主机的硬件地址 而数据包首先是被网卡接收到再去处理上层协议的 如果接收到的数据包的硬件地址与本机不符 则直接丢弃 因此在通讯前必须获得目的
  • pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn pym

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • HCIP——OSPF知识点

    目录 一 OSPF协议的简介 二 OSPF的五种数据包 三 OSPF协议的7种状态机 四 OSPF 的工作过程 五 OSPF的基础配置 六 扩展配置 七 OSPF的LSA 八 OSPF的不规则区域 一 OSPF协议的简介 Ospf 开放式最
  • 3D渲染速度慢,花重金买显卡还是用云渲染更划算

    3D渲染对建筑师和设计师来说并不陌生 3D渲染的过程中出现渲染卡顿 特殊材质难以渲染 或者本地配置不足 本地渲染资源不够时 常常会影响工作效率 本文比较了3D渲染时 为提高工作效率 买显卡还是用云渲染更划算 希望对大家有帮助 3D渲染速度慢
  • 电脑麦克风输入没声音,如何解决

    文章目录 一 麦克风输入没声音的原因 二 解决办法 1 打开麦克风隐私权限 2 设置更换输入设备 3 打开麦克风设置 4 更新声卡驱动 重启电脑 5 设备损坏 更换设备 一 麦克风输入没声音的原因 麦克风没声音 麦克风设置问题或硬件损坏问题
  • 【数据集】浙大动态人类3d数据集LightStage

    LightStage LightStage是一个多视图数据集 在NeuralBody中提出 该数据集使用具有 20 同步摄像头的多摄像头系统捕获多个动态人类视频 人类执行复杂的动作 包括旋转 太极 手臂摆动 热身 拳击和踢腿 我们提供使用E
  • innodb存储引擎

    文章目录 1 innodb存储引擎概述 2 innodb体系架构 2 1后台线程 2 2内存 1 缓冲池 2 LRU list 和 Flush list 和Free list 3 重做日志缓冲 4 额外的内存池 2 4Checkpoint技
  • 在AIX4.3.3 ; AIX5.1 和 AIX5.2上安装OpenSSH

    在AIX4 3 3 AIX5 1 和 AIX5 2上安装OpenSSH 在AIX4 3 3 AIX5 1 和 AIX5 2上安装OpenSSH 一 在IBM AIX4 3 3 上安装OpenSSH At 4 3 3 the openSSH
  • 一战上岸北京211 初试+复试 408错题笔记

    趁着现在还记着点复试的内容我先把复试的内容捋一遍 先是政治问题 都是大概意思 假如导师给你分配的事情比较多 你心情会发生什么样的变化 怎么看待近两年中国的抗疫历程 我国把人民生命健康放在第一位说明了什么 怎么看待网络打赏行为 应该还有一个问
  • 树莓派Ubuntu20.04安装ros系统

    第一位大佬的博文 第二位大佬的博文 首先设置软件源 这里可以是官方源也可以是镜像 由于我官方源就成功了 所以没用镜像源 sudo sh c echo deb http packages ros org ros ubuntu lsb rele
  • AI实战训练营(Class 5)MMPretrain代码实战

    AI实战训练营 Class 5 MMPretrain代码实战 1 安装MMPretrain 首先安装openmim工具 从源码安装mmpretrain 通过下面的命令安装多模态版本的 mmpretrain 2 熟悉MMPretrain 猫狗
  • Traceback (most recent call last): File "", line 1, in ImportError: No module named

    在学习python的过程中会遇到如下错误 gt gt gt import mytest Traceback most recent call last File

随机推荐