#pragma once和#ifndef / #define / #endif的区别

来源:互联网 发布:片源网源码 编辑:程序博客网 时间:2024/06/05 14:52

                                转摘自: http://www.360doc.com/content/10/0124/00/722458_14261695.shtml

 

#pragma once 指令
格式如下:
#pragma once
这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件只被被编译一次。
(1)#pragma once是编译相关的,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性
差,不过现在基本上已经是每个编译器都有这个定义了。
(2)#ifndef / #define / #endif是C++语言相关的,它是通过C++语言中的宏定义来避免头文件被多次编译的。所以在
所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。


关于#pragma once和#ifndef / #define / #endif的详细区别:

两者的共同点都是为了避免同一个文件被include多次,但是各有千秋。
在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些声明语句
#endif
优点:
#ifndef由语言支持,移植性好。它依赖于宏名字不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内
容完全相同的两个文件不会被不小心同时包含。
另外,为了保证不同头文件中的宏名不冲突,故采取类似于_ABC_H_的取名方式。其中,abc.h为当前头文件名。
缺点:
如果不同头文件的宏名不小心“撞车”,可能就会导致头文件明明存在,编译器却硬说找不到声明的状况。
方式二:
#pragma once
... ... // 一些声明语句
优点:
#pragma once由编译器提供保证:同一个文件不会被包含多次。注意这里所说的“同一个文件”是指物理上的一个文
件,而不是指内容相同的两个文件
。于是不必再费劲想个宏名了,当然也就可以避免宏的名字冲突问题了。
缺点:
如果某个头文件有多份拷贝,本方法不能保证他们不被重复包含。
综上,一般可以这样处理:
# infndef XX
# define XX
# if _MSC_VER > 1000
# pragma once
# endif

 

注意:_MSC_VER是出于版本兼容性考虑,定义Defines the compiler version. Defined as 1200 for Microsoft Visual
C++ 6.0. Always defined.
【注】由于#ifndef方式可以通过前面介绍的特殊的宏的取名方式来避免名称冲突问题,于是其缺点也就不复存在了,
进而#ifndef方式就更常用了。

原创粉丝点击