#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 …
请登录后发表评论
注册
社交帐号登录