【C++拾遗之八】#pragmaonce与#ifndef的用法总结

2023-10-27

一、两种宏定义的功能

#ifndef 和 #pragma once都是C/C++中的两种宏定义。它们的作用是为了避免同一个头文件被多次包含(include)

note只能保证单一文件不会重复包含,不能保证不同文件重复包含

二、两种宏定义的用法

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

三、两种宏定义的区别

(1)#ifndef

#ifndef的方式受C/C++语言标准支持。它不仅可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(或者代码片段)不会被不小心同时包含。

优点:移植性好
缺点:

  1. 宏名冲突:如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,但编译器却硬说找不到声明的状况——这种情况有时非常让人郁闷。

  2. 编译时间长: 由于编译器每次都需要打开头文件才能判定是否有重复定义,因此在编译大型项目时,ifndef会使得编译时间相对较长,因此一些编译器逐渐开始支持#pragma once的方式。

(2)#pragma once

#pragma once 一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。

优点:避免宏名冲突、编译速度快

缺点:

  1. 当某个头文件有多份拷贝时,不能保证他们不被重复包含。
  2. 不支持跨平台。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++拾遗之八】#pragmaonce与#ifndef的用法总结 的相关文章

  • gcc -l参数和-L参数

    l参数和 L参数 l参数就是用来指定程序要链接的库 l参数紧接着就是库名 那么库名跟真正的库文件名有什么关系呢 就拿数学库来说 他的库名是m 他的库文件名是libm so 很容易看出 把库文件名的头lib和尾 so去掉就是库名了 好了现在我
  • C++编程——类模板

    文章目录 1 类模板语法 2 类模板与函数模板的区别 3 类模板中成员函数创建时机 4 类模板对象做函数参数 5 类模板与继承 6 类模板成员函数类外实现 7 类模板分文件编写 8 类模板与友元 9 类模板案例 1 类模板语法 类模板的作用
  • CSDN-markdown编辑器

    欢迎使用Markdown编辑器 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何使用Markdown编辑器 可以仔细阅读这篇文章 了解一下Markdown的基本语法知识 新的改变 我们对Markdown编辑器
  • linux通信机制signal()函数详解

    我们来谈一谈signal 函数的作用 linux系统提供了signal 和sigaction 两个函数来改变对于信号的处理方法 其中signal 是一个基于sigaction 系统调用的glibc库函数 其行为在不同的linux操作系统存在
  • Qt Creator下载和安装(详细教程)

    简介 Qt是跨平台的图形开发库 目前由Digia全资子公司 Qt Company 独立运营 官方网址 http www qt io 也可以访问Qt项目域名 http qt project org Qt本身支持众多操作系统 从通用操作系统Li
  • LFSR(线性反馈移位寄存器)的C++实现

    n级线性反馈移位寄存器 这里以n 7为例 假设初始状态为1000000 使用C 标准库中的bitset类来实现 bitset类的用法详解 点击打开链接 include
  • STL的一些基本背景了解。

    STL源代码的头文件一般都是内联模式的 现在简单的把stl的集中类型进行分类说明一下 1 容器类 一般分为关联式容器和顺序式容器 典型的例子的就是vector为典型的顺序式容器 对于stl来说主要采用向量 链表 二叉树以及他们的组合为底层存
  • [C++]高效使用c++11--理解auto类型推导

    推导类型 1 理解类型推导 auto的推导方式和template是一样的 所以我们首先来介绍template是如何推导类型的 template
  • c 编程 常犯的错误,隐藏性很高,而且很致命

    1 申请内存 1 1 内存大小错误 比如 申请一块存放8个unsigned int 数据的内存空间 错误 malloc 8 正确 malloc 8 sizeof unsigned int 注解 malloc申请内存 是以字节为单位的 所以当
  • gcc/g++交叉编译*.c/*.cpp程序时的配置

    CFLAGS I PWD src CFLAGS I third party hisi include CFLAGS L third party hisi lib CXXFLAGS I PWD src CXXFLAGS I third par
  • 位运算符(一):C/C++位运算符

    位运算是指按二进制进行的运算 在程序中 常常需要处理二进制位的问题 C C 语言提供了6个位操作运算符 这些运算符只能用于整型操作数 即只能用于带符号或无符号的char short int与long类型 在实际应用中 建议用unsigned
  • 【FFmpeg学习笔记一】FFmpeg简介

    Fmpeg简介 一 FFmpeg简介 二 FFmpeg函数库 三 FFmpeg用例 四 相关链接 一 FFmpeg简介 FFmpeg是一款自由软件 核心功能就是音视频编解码 其中的 FF 指的是 Fast Forward 快速前进 FFmp
  • 定义和声明的区别

    对于变量来说 定义就是声明 例如 int a 我们可是说它是定义也可以说它是声明 但是对于函数来说定义和声明完全不是一回事 void sum int a int b 这是函数的声明 void sum int a int b 整体是函数的定义
  • KEIL编译出现错误“source file is not valid utf-8”

    KEIL编译出现错误 source file is not valid utf 8 在外面复制了一段代码 c文件一直报错source file is not valid utf 8的错误 经查找原因就是 文件中出现中文符号导致的 特别是中文
  • c#中new 后面大括号

    C new一个对象的时候 后面的参数不是用小括号吗 下面的大括号是怎么回事 不是数据为什么会用大括号 BarcodeWriter barcodeWriter new BarcodeWriter Format ZXing BarcodeFor
  • Qt与VS的对比(1)

    对话框篇 QT与VS创建对话框的方式非常相似 都需要创建一个对话框类 在需要显示该对话框的地方包含对应的头文件 显示即可 区别 QT显示模态对话框使用函数QDialog exec VS显示模态对话框使用函数CDialog DoModal Q
  • [转载]PropertyChanged 事件

    在 NET平台上 数据绑定是一项令人十分愉快的技术 利用数据绑定能减少代码 简化控制逻辑 通常 可以将某个对象的一个属性绑定到一个可视化的控件上 当属性值改变时 控件上的显示数据也随之发生变化 要实现这一功能 只需要为自定义对象实现 INo
  • C# 理解Thread.Sleep()方法 (转载学习)

    我们可能经常会用到 Thread Sleep 函数来使线程挂起一段时间 那么你有没有正确的理解这个函数的用法呢 思考下面这两个问题 1 假设现在是 2008 4 7 12 00 00 000 如果我调用一下 Thread Sleep 100
  • c#中日志NLog配置问题

    Failed obtaining configuration for Common Logging from configuration section common logging 在配置中没有配置对 另外很有可能是NLog 的配置文件没
  • win7安装了vc++6.0打开已保存文件项目就会崩溃

    我用win7安装了vc 6 0的英文完整版 绿色中文版 发现当运行程序时 要打开已保存文件项目就会崩溃 系统对话筐就说 Microsoft R Developer Studio已停止工作 选择调试或者关闭 office 2010 与vc 6

随机推荐

  • 【刷题笔记6】LeetCode 162. 寻找峰值(二分查找优化)

    用分享的方式成长 用有趣的眼光看世界 欢迎来到12 26 25的博客 热爱编码 算法 知识总结 不定期更新有趣 有料 有营养内容 让我们共同学习 共同进步 系列索引 刷题笔记0 系列目录索引 持续更新 推荐收藏 本题题目 LeetCode
  • 构建跨平台应用的利器——UniApp入门级开发小实战

    文章目录 待办事项列表应用 1 创建项目和页面 2 设置路由 3 编写主页 4 编写任务详情页 5 完善导航功能 6 运行项目 天气预报应用 1 创建项目和页面 2 设置路由 3 编写主页 4 编写天气详情页 5 完善导航功能 6 运行项目
  • (10)QWidget的使用(one)

    目录 QWidget的大小和位置 获取QWidget的大小和位置 设置QWidget的大小和位置 设置窗口固定大小 限定窗口的大小 坐标系统转换 内容边距 鼠标指针 鼠标指针的形状 自定义光标的使用 获取和设置光标的坐标 QWidget类是
  • jdbcURL连接参数

    jdbc mysql 192 168 0 105 3306 shgb fz useUnicode true characterEncoding UTF8 autoReconnect true zeroDateTimeBehavior con
  • 设计模式-状态模式的简单实现

    状态模式包括以下几种角色 Context 状态持有类 它定义了客户程序需要的接口并维护一个具体状态角色的实例 将与状态相关的操作委托给当前的Concrete State对象来处理 State 抽象状态类 定义一个接口以封装使用上下文环境的的
  • 1000行Python代码实现五个小游戏,愁死人系列....

    Python开发小游戏 它有又双叒叕来了 一 效果展示 1 俄罗斯方块 2 扫雷 3 五子棋 4 贪吃蛇 害 这个是最惊心动魄的 为了我的小心脏 不玩了不玩了 二 代码展示 https jq qq com wv 1027 k SFu7oNI
  • 坐标计算公式

    直线 x x 0 L
  • 稳压二极管的原理,它有什么作用?

    对于从事硬件设计的工作者来说 稳压管应该是我们在项目中最常用的器件之一了 稳压二极管 其又被称为齐纳二极管 其在电路中起稳定电压的作用 利用二极管被反向击穿后 在一定反向电流范围内反向电压不随反向电流变化一特点进行稳压的 与普通二极管最大区
  • 分享四个一键生成神器:Logo、App、小程序、H5等五分钟快速搞定

    第一个 Logo生成器 www logaster cn 一个logo修正一二十遍依然定不了 那么就用这个网站 简单的操作 依照提示就能一步步本人搞定logo 而且开能够输入关键词 自动生成logo 第二个 二维码生成器 https cli
  • np.diag()函数

    nunpyp diag 调用方法 numpy diag v k 0 各个参数意义 v 如果v是一个2维数组 就会返回这个二维数组中第k个对角线上值新组成的一维数组 如果v是一维数组 返回一个二维数组 其中v处于第k个对角线上 k 可选参数
  • 设计模式Java实战

    文章目录 一 前置 1 1 目的 1 2 面向对象 1 3 接口和抽象类 二 七大设计原则 2 1 单一职责 2 2 接口隔离原则 2 3 依赖倒转原则 2 4 里氏替换原则 2 5 开闭原则 2 6 不要重复原则 2 7 迪米特最少知道法
  • layui - 重载和刷新表格时保持在当前页码 - 获取当前数据所在的页码 和 显示条数

    感谢大佬 转载文章自己存档 https blog csdn net COCOLI BK article details 88417605 layui laypage em next html 当前页码值 layui laypage limi
  • Android显示系统 SurfaceFlinger内部机制 3 APP申请创建Surface的过程

    韦东山 笔记 3 APP申请创建Surface的过程 看看Surface test的过程 1 获取SF服务 2 创建Surface 3 得到buffer 4 写buffer 5 回顾下获取SF服务过程 AP获取SF服务 调用createCo
  • C++获取当前时间 (std::chrono)

    在C 11之前要获取当前时间 大多数情况下要使用C语言的time库 include
  • vue.config.js文件配置devServer和devServer.proxy多个代理地址

    如何在vue config js文件配置属性devServer和devServer proxy配置多个代理地址 如下所示 比如 封装请求方法格式 可以略过 module exports outputDir dist 打包后输出文件名称 以及
  • vue-amap 定位和逆解码

    1 安装 npm install vue amap save 2 main js引入 import VueAMap from vue amap Vue use VueAMap VueAMap initAMapApiLoader key ke
  • 向量与矩阵的相乘

    向量与矩阵的相乘 2016年07月31日 10 00 55 阅读数 2253 在学习计算机图形学的时候 最常遇到的就是矩阵的乘法了 下面我们就简单的介绍下 使用程序如何编写两个矩阵的相乘呢 其实这个问题 大一的孩子都会写的 不是很难的 但是
  • 【文本信息处理】网络文本访问和处理+分词

    一 网络文本访问和处理 1 re findall 返回string中所有与pattern匹配的全部字符串 返回形式为数组 def findall pattern string flags 0 Return a list of all non
  • unity 实现Android端视频在UI上播放

    之前unity实现在RawImage上播放视频主要是通过movieTexture 而现在这个方法已经被抛弃 采用VideoPlayer来实现 实现的原理是将VideoPlayerd的视频渲染到UGUI的RawImage上 private V
  • 【C++拾遗之八】#pragmaonce与#ifndef的用法总结

    宏定义 一 两种宏定义的功能 二 两种宏定义的用法 三 两种宏定义的区别 一 两种宏定义的功能 ifndef 和 pragma once都是C C 中的两种宏定义 它们的作用是为了避免同一个头文件被多次包含 include note 只能保