iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中#pragma once的作用
  • 756
分享到

C语言中#pragma once的作用

2024-04-02 19:04:59 756人浏览 泡泡鱼
摘要

目录1、#pragma once有什么作用?2、两者的使用方式有何区别?3、两者各有何特点?(1)#ifndef(2)#pragma once4、两者之间有什么联系?1、#pragm

1、#pragma once有什么作用?

为了避免同一个头文件被包含(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的编译器报错,所以混用两种方法似乎不能带来更多的好处,倒是会让一些不熟悉的人感到困惑。

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

为了避免同一个文件被include多次:

  • 1、#ifndef方式
  • 2、#pragma once方式

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

方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif

方式二:
#pragma once
... ... // 一些声明语句

ifndef的方式依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。

pragma once则由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。带来的好处是,你不必再费劲想个宏名了,当然也就不会出现宏名碰撞引发的奇怪问题。

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

方式一由语言支持所以移植性好,方式二 可以避免名字冲突。

--结束END--

本文标题: C语言中#pragma once的作用

本文链接: https://www.lsjlt.com/news/148590.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中#pragma once的作用
    目录1、#pragma once有什么作用?2、两者的使用方式有何区别?3、两者各有何特点?(1)#ifndef(2)#pragma once4、两者之间有什么联系?1、#pragm...
    99+
    2024-04-02
  • C语言中的#pragma pack(1)如何使用
    这篇“C语言中的#pragma pack(1)如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言中的#pragma...
    99+
    2023-07-05
  • C语言之pragma用法详解
    (0)前言 C语言Pragma 指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma 指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或...
    99+
    2023-10-12
    c语言 java linux c++ 开发语言
  • c语言pragma的用法是什么
    `#pragma` 是一个编译指令,用于告诉编译器执行特定的操作或者设置特定的编译选项。在C语言中,`#pragma` 可以用于以下...
    99+
    2023-09-04
    c语言
  • C语言pragma函数怎么使用
    在C语言中,`#pragma`是一个预处理指令,用于向编译器发出特定的指令。`#pragma`指令的具体形式和功能因编译器而异,但通...
    99+
    2023-08-08
    C语言 pragma
  • C语言中#pragma pack(1)的用法与注意点
    目录一:何时使用二. 为什么使用#pragma pack(1)三.注意点四.#pragma pack()的一些用法五.题目附:C语言慎用#pragma pack(1)命令总结一:何时...
    99+
    2023-02-21
    c语言 #pragma pack(1) c语言中pragma怎么用 pragma使用例子pack
  • C语言详细讲解#pragma的使用方法
    目录一、#pragma 简介二、#pragma message三、#pragma once四、#pragma pack五、小结一、#pragma 简介 #pragma 用于指示编译器...
    99+
    2024-04-02
  • C语言 详细讲解#pragma的使用方法
    #pragma是C语言中的预处理指令,用于告诉编译器在编译过程中采取特定的行为。以下是#pragma的使用方法的详细讲解:1. #p...
    99+
    2023-08-08
    C语言
  • Go语言中Once如何使用
    Go语言中Once如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。sync.Once是sync包中的一个对象,它只有一个...
    99+
    2024-04-02
  • C++中怎么操作#pragma指令
    C++中怎么操作#pragma指令,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在...
    99+
    2023-06-17
  • c语言中enum的作用
    enum 是 c 语言中创建枚举类型的关键字,用于表示一系列已命名的常量。它通过以下步骤使用:定义枚举类型:enum 枚举类型名 { 常量1, 常量2, ..., 常量n }声明枚举类型...
    99+
    2024-05-09
    c语言
  • c语言中volatile的作用
    volatile关键字在c语言中告知编译器变量在程序外部可能被修改,确保即使程序未明确引用该变量,也能读取最新值。它可以防止优化、保证线程安全,并用于与硬件交互。 volatile关键...
    99+
    2024-05-10
    c语言 排列
  • c语言中auto的作用
    auto 关键字在 c 语言中声明局部自动存储变量,具有以下作用:局部范围:仅在声明变量的函数或块范围内可见。自动存储:存储在函数栈中,函数调用时分配内存,返回时释放。默认初始化:整数类...
    99+
    2024-04-29
    c语言
  • c语言中default的作用
    default是用于switch-case语句中的关键字,当表达式不匹配任何case时执行。它提供了一个处理所有未处理情况的通用机制,并且通常用于错误处理。 C语言中default的作...
    99+
    2024-05-02
    c语言
  • c语言中extern的作用
    extern关键字在c语言中用于声明外部定义的变量、函数或其他符号,避免重复定义错误并增强代码可扩展性。它允许在当前源文件中声明外部符号,分配内存并引用它,即使没有确切定义。 exte...
    99+
    2024-05-09
    c语言
  • c语言中float的作用
    浮点数数据类型float在c语言中表示带小数点的数字,存储4个字节,范围为-3.40282347e+38到3.40282347e+38,精度约为7位有效数字。float主要用于表示小数、...
    99+
    2024-05-10
    c语言
  • c语言中strcmp的作用
    strcmp 函数比较两个字符串,返回整数值:0(相等)、正数(第一个字符串大于第二个字符串)、负数(第一个字符串小于第二个字符串)。 C 语言中 strcmp 的作用 strcmp ...
    99+
    2024-05-07
    c语言 标准库
  • c语言中strcat的作用
    c语言中的strcat函数用于连接两个字符串,将源字符串src附加到目标字符串dest末尾,拼接结果存储在dest中。 C语言中strcat函数的作用 定义: strcat函数(str...
    99+
    2024-05-08
    c语言
  • c语言中break的作用
    break语句用于退出循环或switch语句,在循环中执行break立即终止循环,在switch语句的case分支中执行break跳出switch语句。 C语言中break的作用 br...
    99+
    2024-05-09
    c语言
  • c语言中long的作用
    long类型在c语言中用于存储比int类型更大范围的整数。它主要用于:存储超出int范围的整数。存储更高精度的整数,因其通常具有更大的位宽。存储指针变量,其通常需要存储更大的地址值。 ...
    99+
    2024-05-09
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作