1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【转载】#pragma once与#ifndef #define #endif的区别

【转载】#pragma once与#ifndef #define #endif的区别

时间:2020-08-08 21:52:22

相关推荐

【转载】#pragma once与#ifndef #define #endif的区别

一、相同点

两者的共同点都是为了避免同一个文件被 include 多次,但是 #ifndef #define #endif 不只有这个作用。

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

二、收集理解

1.#pragma once

这个是编译器相关,就是说在这个编译系统上能用,在其他编译系统不一定行,即移植性差。不过现在基本上已经是每个编译器都有这个定义了。

此方式由编译器保证同一个文件不会被包含多次。注意:这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。于是不必再费劲想个宏名了,当然也就可以避免宏的名字冲突问题了。

缺点:如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。

举例:在一般的 MFC 程序中可以看到

?

其中 _MSC_VER 分解如下:

MS:Microsoft(微软)的简写

C:MSC 就是 Microsoft 出的 C 编译器

VER:Version(版本)的简写

#if _MSC_VER > 1000 的意思就是如果编译器版本高于 1000(VC++5.0)

可以看到:在 _MSC_VER 小于 1000 时,它对 #pragma once 是不支持的。

2.#ifndef #define #endif

该方法与 C++ 语言相关,是 C++ 语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持 C++ 语言的编译器上都是有效的。如果写的程序要跨平台,最好使用这种方式。该方式由于是 C++ 语言本身支持,所以移植性好。它依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。另外,为了保证不同头文件中的宏名不冲突,故采取类似于_ABC_H_的取名方式。其中,abc.h为当前头文件名。

举例:常常在一些头中可以看到

?

缺点:如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。但这个缺点恰恰是我们可以利用的优点,#ifndef 方式可以通过前面介绍的特殊的宏的取名方式来避免名称冲突问题,于是其缺点也就不复存在了,进而 #ifndef 方式就更常用了。

三、相比之下

1.性能上的区别

使用 #ifndef 的话,编译器每次看到 #include 这个文件都需要读入文件,解析代码; 而使用 #pragma once 编译器根本不会重复打开文件, 大大提高了效率。

2.编码风格上的区别

使用 #pragma once 的代码简洁,显然比 #ifndef 要简短许多,重要的是它避免了头文件标号(如 __myheader_h__ )的重定义或者 #endif 包含范围错误的情况。

3.语意上的区别

#pragma once 是针对文件的,它告诉编译器,本文件只编译一次。

#ifndef #define #endif 只是针对文件中的某一个标号而言的,它能用于防止三个指令间所包含内容的重复性处理。就这一点而言,后者更灵活。

4.可移植性方面

#pragma once 是微软的开发工具中所使用的,如 .net,vc6 等工具可以完好的支持;

#ifndef #define #endif 是标准里面的一部分,所以对于任何完好支持 C/C++ 的编译器都能使用。显而易见,后者的可移植性更高。

四、引用通告

在总结的过程中,看了一些网页,也引用到其中的一些内容,现给出链接,这里仅供本人学习,谢谢引用到的作者。

原文地址:http://pppboy./blog/static/302037966130528324/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。