#ifndef 与 #program once

news2024/11/15 10:28:09

#ifndef #program once

2021年09月08日星期三·席锦

为了避免同一个文件被include多次,C/C++中有两种方式:

(1)#ifndef

(2)#pragma once

在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。

(1)#ifndef使用简单示例:

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

(2)#pragma once使用简单示例:

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

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

当然,缺点就是如果不同头文件中的宏名不小心“撞车”,可能就会导致你看到头文件明明存在,编译器却硬说找不到声明的状况——这种情况有时非常让人抓狂。

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

(2)#pragma once一般由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你无法对一个头文件中的一段代码作#pragma once声明,而只能针对文件。

其好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。大型项目的编译速度也因此提高了一些。

对应的缺点就是如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。当然,相比宏名碰撞引发的“找不到声明”的问题,这种重复包含很容易被发现并修正。

(2)#pragma once方式产生于(1)#ifndef之后,因此很多人可能甚至没有听说过。目前看来(1)#ifndef更受到推崇。因为(1)#ifndef受C/C++语言标准的支持,不受编译器的任何限制;而(2)#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1107117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++基础——内存分区模型

1 概述 C程序在执行是,将内存大致分为4个区域: 代码区:用于存放二进制代码,由操作系统进行管理全局区:存放全局变量和静态变量及常量栈区:由编译器自动分配释放,存放函数的参数、局部变量等堆…

电脑版便签软件下载用哪个?

在面对每天繁忙的工作日程,电脑是许多上班族不可或缺的工作助手,而一款得心应手的电脑便签软件,更是可以帮助大家记录、提醒、督促各项任务按时完成的得力助手。那么,究竟在众多的电脑便签软。件中,哪一位能够真正成为…

你真的理解“感受野”了吗?

大家好啊,我是董董灿。 在卷积神经网络中,有一个非常重要且绕不开的概念叫做卷积的“感受野”。 我刚开始学习卷积的时候,仅仅把“感受野”理解为感受视野,没错就是文字上的理解。 但随着后来工作的深入,慢慢发现感…

pytorch的安装【全官网流程】

1.准备python环境 python环境需要看pytorch上说明的版本本文用的是python3.9 conda create -n pytorch39 python3.92.安装pytorch【要使用GPU的先安装步骤3的CUDA在安装这个】 pytorch官方地址 (1)官方指出了python版本: (2…

微信私域怎么高效转化?看看这款系统!

在今天的数字化时代,私域流量已经成为企业与个人创业者获取竞争优势的重要手段。而微信作为中国最大的社交平台之一,其私域流量的价值不言而喻。那么,如何才能轻松玩转微信私域流量呢?接下来,我们将为你介绍一款强大的…

设计模式:抽象工厂模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

大家好!本节主要介绍设计模式中的抽象工厂模式。 简介: 抽象工厂模式,它是所有形态的工厂模式中最为抽象和最具一般性的一种形态。它用于处理当有多个抽象角色时的情况。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指…

TCP/IP(十九)TCP 实战抓包分析(三)TCP 第一次握手 SYN 丢包

一 TCP 三次握手异常情况实战分析 说明: 本文是TCP 三次握手异常系列之一 ① 异常场景 接下里我用三个实验案例,带大家一起探究探究这三种异常关注: 如何刻意练习模拟上述场景 以及 wireshark现象 ② 实验环境 ③ 实验一:TCP 第一次握…

STM32F407在RAM中执行程序

STM32F407在flash中执行代码的速度比在ram中执行代码的速度快。因为STM32F407有一颗“自适应实时存储器加速器”,这里不讨论ART Accelerator的加速方案。 把代码放在RAM中执行纯粹是为了学习。 将个别函数的代码放到RAM中运行 使用自己编写的链接脚本(sct文件)。 …

《论文阅读28》OGMM

一、论文 研究领域: 点云配准 | 有监督 部分重叠论文:Overlap-guided Gaussian Mixture Models for Point Cloud Registration WACV 2023 二、概述 概率3D点云配准方法在克服噪声、异常值和密度变化方面表现出有竞争力的性能。本文将点云对的配准问题…

【计算机网络原理】初始网络基础

文章目录 1. 网络发展史1.1 单机时代1.2 网络互连局域网 LAN广域网 WAN 2. 网络通信基础2.1 IP 地址2.2 端口号2.3 协议2.4 五元组2.5 协议分层2.5.1 OSI七层模型2.5.2 TCP/IP五层模型 2.6 封装和分用2.6.1 数据封装(发送方情况)2.6.2 数据分用(接收方情况) 总结 1. 网络发展史…

这是不是你们都在找的免费又好用的配音网站?

随着人工智能技术的不断发展和普及,AI配音软件也越来越多地进入人们的视野。它可以帮助我们快速地将文字转换成语音,让我们的工作变得更加高效和便捷。在本文中,我将介绍一款非常实用而且免费的AI配音网站,超级简单好用&#xff0…

C++string的使用

CSDN的uu们,大家好。这里是C入门的第十六讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1.构造函数 1.1 string() 1.2 string(const char* s) 1.3 string(const …

Cinema 4D云渲染一分钟动画要多少钱?如何进行Cinema 4D云渲染?看完就懂了

1.为什么Cinema 4D要使用云渲染? 近年来,Cinema 4D在实现视觉效果方面取得了很大的进展。但是,随着视觉效果的复杂化,渲染的工作量也相应增加,导致渲染时间变长。在这种情况下,云渲染平台就能…

Linux嵌入式系统开发之路:从小白到大牛

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 嵌入式系统开发是一个充…

Spring framework Day22:Aware接口

前言 在Spring框架中,有许多接口和类都有一个非常重要的作用——让我们能够更方便地构建应用程序和管理组件。其中,Aware接口就是其中一个非常重要的接口之一。通过实现该接口,我们可以让Spring容器感知到特定的组件和资源,并进行…

媒体转码和输出软件:Media Encoder 2024中文版

想要高效地转码、优化输出吗?那就来尝试全新的Media Encoder 2024吧!Media Encoder是Adobe公司出品的一款媒体转码和输出软件,可以帮助您快速、高效地将多种格式的视频和音频转换为所需的输出格式。 全新的Media Encoder 2024提供了更加智能…

【CANoe】XML Test Module使用实例

文章目录 一、实操步骤1、增加XML Test Module节点2、配置XML Test Module节点3、XML Test Module节点增加CAPL脚本(.can文件)4、文件夹结构5、使用仿真节点开始测试6、测试结果与测试报告7、同理,在Test Setup也可如此操作 一、实操步骤 1、增加XML Test Module节…

使用conda install一直卡在solving environment的解决方法

使用国内镜像源,但install仍旧一直卡在solving environment,超过10分钟就不用等了; 检查C:\Users\UserName 路径下的.condarc文件 将这个defaults这一行删掉即可

【Linux-常用命令-基础命令-复制-copy-命令-笔记】

【Linux-常用命令-基础命令-复制文件-copy-命令-笔记】 1、前言2、操作3、自己的实践 1、前言 最近,在使用Linux的时,使用相关基础命令是,总是容易忘记,上网一搜,大部分都写的比较繁琐,我就找下复制命令&a…

【算法设计与分析qwl】04 NP-hard——只是举例几个,货郎,双机调度,01背包

NP-hard问题: 有效算法是 输入规模的多项式时间算法。 这些问题的难度处于可有效计算的边界。 算法数据结构程序设计 例4 货郎问题 建模与算法: 解是一个排列, 0-1背包问题: 建模: 双机调度: 建模&#x…