【干货】C语言中#pragmaonce的作用和两者的区别

#pragmaonce 在 C 语言中的作用

1、#pragma once 有什么作用?

为了避免同一个头文件被多次包含(include),C/C++中有两种宏实现方法:一种是#ifndef方法;另一种是#pragma once 方法。

就可以同时支持两者的编译器而言c语言为何要避免使用宏,两者之间没有太大区别。但是两者之间仍然存在一些细微的差异。

2、两者的使用方式有什么不同?

示例代码如下:

//方式一:
#ifndef  __SOMEFILE_H__
#define   __SOMEFILE_H__
... ... // 声明、定义语句
#endif
//方式二:
#pragmaonce
... ... // 声明、定义语句

3、各有什么特点?(1)#ifndef

ifndef 方法受 C/C++ 语言标准支持。它不仅可以确保同一个文件不会被多次包含,还可以确保两个内容完全相同的文件(或代码片段)不会被意外包含在同一时间。

当然,缺点是如果不同头文件中的宏名不小心“碰撞”,可能会导致你看到头文件明明存在,但是编译器却坚持找不到声明——这种情况有时很烦人郁闷。

由于编译器每次都需要打开头文件来判断是否有重复定义,ifndef在编译大型项目时会使编译时间比较长,所以一些编译器逐渐开始支持#pragma once方法。

(2)#pragma 一次

编译器通常会保证 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的编译器难免会报错,所以混合使用这两种方法似乎并没有带来更多的好处,但它会让一些不熟悉的人。使困惑。

在了解了两种方法后,应根据具体情况确定选择哪种方法。在我看来,任何一种方式都是可以接受的,只要有一个合理的约定来避免这些缺点。这不再是标准或编译器的责任。它应该由程序员自己或由小规模的开发规范来完成。

为避免多次包含同一个文件:

就支持它们的编译器而言,两者之间没有太大区别,但两者之间仍然存在一些细微差别。

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

ifndef 的方法依赖于宏名不冲突c语言为何要避免使用宏,这样既保证了同一个文件不会被多次包含,又保证了两个内容相同的文件不会被意外同时包含。当然,缺点是如果不同头文件的宏名不小心“碰撞”,可能会导致头文件明明存在,但编译器却坚持找不到声明的情况。

pragma once 由编译器保证:同一个文件不会被多次包含。注意这里所说的“同一个文件”是指一个物理文件,而不是两个内容相同的文件。好处是你不必为宏名考虑太多,当然也不会出现宏名冲突引起的奇怪问题。

相应的缺点是,如果一个头文件有多个副本,这种方法不能保证它们不会被重复包含。当然,相比于宏名冲突导致的“找不到声明”问题,重复包含更容易查找和修复。

第一种方法是语言支持的,所以可移植性好,第二种方法可以避免名称冲突。

下一节:C语言深入探讨自定义类型的结构和枚举以及联合C语言编程技术

1.Structure1.1 struct类型的声明结构是一个值的集合,称为成员变量。结构的每个成员都可以是不同类型的变量。下面举个例子给大家演示一下: //定义一个学生的结构 typedef stru …

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论