1、相同点
二者的共同点都是为了不同一个文件被 include 屡次,可是 #ifndef #define #endif 不仅有这个做用。
在可以支持这两种方式的编译器上,两者并无太大的区别,可是二者仍然仍是有一些细微的区别。
2、收集理解
1.#pragma once
这个是编译器相关,就是说在这个编译系统上能用,在其余编译系统不必定行,即移植性差。不过如今基本上已是每一个编译器都有这个定义了。
此方式由编译器保证同一个文件不会被包含屡次。注意:这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。因而没必要再费劲想个宏名了,固然也就能够避免宏的名字冲突问题了。
缺点:若是某个头文件有多份拷贝,本方法不能保证他们不被重复包含。
举例:在通常的 MFC 程序中能够看到
#if !defined(AFX_STDAFX_H__32722022_E372_4A5C_8EC5_BBB243CEDE1D__INCLUDED_)
#define AFX_STDAFX_H__32722022_E372_4A5C_8EC5_BBB243CEDE1D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TODO: reference additional headers your program requires here
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STDAFX_H__32722022_E372_4A5C_8EC5_BBB243CEDE1D__INCLUDED_)
其中 _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 __SOMEFILE_H__
#define __SOMEFILE_H__
// 一些声明语句
#endif
缺点:若是不一样头文件的宏名不当心“撞车”,可能就会致使头文件明明存在,编译器却硬说找不到声明的情况。但这个缺点偏偏是咱们能够利用的优势,#ifndef 方式能够经过前面介绍的特殊的宏的取名方式来避免名称冲突问题,因而其缺点也就不复存在了,进而 #ifndef 方式就更经常使用了。
3、相比之下
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++ 的编译器都能使用。显而易见,后者的可移植性更高。
4、引用通告
在总结的过程当中,看了一些网页,也引用到其中的一些内容,现给出连接,这里仅供本人学习,谢谢引用到的做者。
http://www.dnbcw.com/biancheng/c/dtox45497.html
http://zhidao.baidu.com/question/154510671.html?fr=ala0
http://zxjgoodboy.blog.sohu.com/87503141.html
http://hi.baidu.com/huqingshuye/blog/item/807a7c006f4a70044afb511a.html