C++ pragma once 与 ifndef 用法区别

#pragma once 与 #ifndef 的做用

(1)在C/C++中,在使用预编译指令#include的时候,为了防止重复引用形成二义性。
(2)在可以支持这两种方式的编译器上,两者并无太大的区别,可是二者仍然仍是有一些细微的区别。程序员

#pragma once 与 #ifndef 的用法

#pragma once

#pragma once

#ifndef

#ifndef _CODE_BLOCK
#define _CODE_BLOCK
// code
...  
#endif // _CODE_BLOCK

#pragma once 与 #ifndef 二者各有何特色

#pragma once

在C/C++中,#pragma once是一个非标准可是被普遍支持的方式。性能

介绍:#pragma once 通常由编译器提供保证:同一个文件不会被包含屡次。注意这里所说的“同一个文件”是指物理上的一个文件,而不是指内容相同的两个文件。你没法对一个头文件中的一段代码做pragma once声明,而只能针对文件。code

优势:你没必要再担忧宏名冲突了,固然也就不会出现宏名冲突引起的奇怪问题。大型项目的编译速度也所以提升了一些。开发

缺点:若是某个头文件有多份拷贝,本方法不能保证他们不被重复包含。固然,相比宏名冲突引起的“找不到声明”的问题,这种 重复包含很容易被发现并修正。另外,这种方式不支持跨平台!编译器

#ifndef

介绍:#ifndef的方式受C/C++语言标准支持, ,也是比较经常使用的方式。io

优势:它不只能够保证同一个文件不会被包含屡次,也能保证内容彻底相同的两个文件(或者代码片断)不会被不当心同时包含。编译

缺点:就是若是不一样头文件中的宏名不当心“撞车”,可能就会致使你看到头文件明明存在,但编译器却硬说找不到声明的情况——这种状况有时很是让人郁闷。 因为编译器每次都须要打开头文件才能断定是否有重复定义,所以在编译大型项目时,ifndef会使得编译时间相对较长,所以一些编译器逐渐开始支持#pragma once的方式。(Visual Studio 2017新建头文件会自带#pragma once指令)。效率

二者之间的联系

(1)#pragma once 方式产生于 #ifndef 以后,所以不少人可能甚至没有据说过。目前看来#ifndef更受到推崇。由于#ifndef受C/C++语言标准的支持,不受编译器的任何限制;而#pragma once方式却不受一些较老版本的编译器支持 (如GCC 3.4版本以前不支持#pragmaonce) ,一些支持了的编译器又打算去掉它,因此它的兼容性可能不够好。
(2) #ifndef能够针对一个文件中的部分代码,而#pragma once只能针对整个文件。兼容性

总结

相对而言,#ifndef 更加灵活,兼容性好,移植性好 ,而 #pragma once 操做简单,能够避免名字冲突,效率高开发规范

看起来彷佛是想兼有二者的优势。不过只要使用了 #ifndef 就会有宏名冲突的危险,也没法避免不支持#pragma once的编译器报错,因此混用两种方法彷佛不能带来更多的好处,却是会让一些不熟悉的人感到困惑。

选择哪一种方式,应该在了解两种方式的状况下,视具体状况而定。只要有一个合理的约定来避开缺点,我认为哪一种方式都是能够接受的。而这个已经不是标准或者编译器的责任了,应当由程序员本身或者小范围内的开发规范来搞定。

最后

通常而言,当程序员听到这样的话,都会选择 #ifndef 方式,为了努力使得本身的代码“存活”时间更久,一般宁愿下降一些编译性能,这是程序员的个性,固然这是题外话啦。