可能重复:
#pragma once vs include guards?的#pragma一次对战#如果定义MYHEADER_INCLUDED_
什么是使用#pragma once
和#if !defined MYHEADER_INCLUDED_
结构的差异(在性能,可用性和功能性)?或者两者有什么不同?
可能重复:
#pragma once vs include guards?的#pragma一次对战#如果定义MYHEADER_INCLUDED_
什么是使用#pragma once
和#if !defined MYHEADER_INCLUDED_
结构的差异(在性能,可用性和功能性)?或者两者有什么不同?
维基百科有此所有的答案,是很容易找到
在C和C++编程语言,
#pragma once
是非标准 但广泛支持的预处理指令旨在导致当前源文件仅在单个编译中包含一次。因此,
#pragma once
服务于相同的目的#include
警卫,但与 几个优点,包括:不代码,避免名称冲突,和 改进的编译速度。
它更深入地看待了article的优缺点。如果你真的感兴趣,我建议你完全阅读它,而不只是上面的blurb。
#pragma once
执行编译速度更快,因为它的意图是明确的defined
版本当然有更广泛的使用了过多的,如果用小心翼翼的将允许其他文件中查看前被列入(例如用于条件编译)#pragma once
- 然而,这是一个非标准扩展#pragma一旦成为标准,我的生活会变得更好一点。 – Mizipzor 2010-06-03 08:32:09
@ mizipzor,我不想要'stragin'#pragma's,我想要MODULES! http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2073.pdf:D – 2010-06-03 08:40:57
'#pragma Once'一天变得不必要了,我的生活会变得好一点。 – 2010-06-03 08:41:08
正如Dan McG说,他们几乎是相同的。但是我不推荐使用#pragma,除非在不能避免的情况下(比如#pragma部分)。它只会让代码更加不标准。
而且没有功能/性能问题。因为这是在编译时间。它可能增加编译时间,但我没有经历任何区别!
虽然编译指令在很多方面都优于#ifdef警卫,但它有一个主要缺陷:它基于文件系统路径:它使用两个不同(绝对)路径也是两个不同文件的基本假设。不幸的是,这并非总是如此。
虽然不太可能会遇到问题,但需要注意。
就性能而言,我还没有对它进行测量,但有广泛报道,编译器认识到#include后卫成语,并且不重新打开/重新处理使用它的文件(因此将它们当作使用#pragma once
来对待) 。
除了潜在的性能优势(可能不存在)之外,我几乎没有看到#pragma once
提供的功能 - 当您创建新的头文件时它更方便 - 但是看守的确不是那么繁重。由于#pragma once
不是特别引人注目,因为我偶尔还会遇到不支持它的编译器,所以我使用了警卫。
如果显示#pragma once
有显着的性能影响,我肯定会开始使用它。
这就是说 - 我希望C被定义为只包含头一次 - 除非某个机制被调用来指示头每次被包含时应该被处理。当你想要这种行为的时代远远超出你不想要的时代(而且我还会偶尔遇到没有警卫或者没有看守的标题)。但它并没有定义的方式,因此包括守卫它是...
一些更多的背景这个:
#pragma once
是非标准的。
如果您很满意在您尝试将其移植到不同平台时发现应用程序或库不会构建时,更改每个头文件的前景,那么这可能是一个不错的选择。
否则,坚持#ifndef/#define/#endif
。 特别是如果您正在为其他人使用建立库代码。
:)谢谢,让我看看这篇文章! – bdhar 2010-06-03 07:56:55
谢谢Donal,最近我在使用块引用按钮时遇到了问题,所以我一直倾向于避免它。我不应该这么懒惰,只是手动做... – 2010-06-03 12:37:27