#pragma曾经#if!定义了MYHEADER_INCLUDED_

时间:2010-06-03 07:44:57

标签: include c-preprocessor

  

可能重复:
  #pragma once vs include guards?

使用#pragma once#if !defined MYHEADER_INCLUDED_结构有何不同(性能,可用性和功能性)?或者两者有什么区别?

7 个答案:

答案 0 :(得分:14)

维基百科为此提供了所有答案,并且很容易找到

From the article

  

在C和C ++编程语言中,#pragma once是非标准的       但广泛支持预处理器指令旨在导致       当前源文件只能在一次编译中包含一次。

     

因此,#pragma once#include守卫的目的相同,但是。{       几个优点,包括:减少代码,避免名称冲突,以及       提高了编译速度。

它更深入地了解article中的优缺点。如果你真的感兴趣我建议你完全阅读它,而不仅仅是上面的模糊。

答案 1 :(得分:7)

  1. 效果 - 通常#pragma once实施编译得更快,因为它的目的很明确
  2. 功能 - 两者都有相同的用途 - 避免多个包含头文件。 defined版本当然也有更广泛的用途,如果小心使用将允许签入另一个文件(如果包括前者)(例如用于条件编译)
  3. 可用性 - 如果可移植性不是问题请使用#pragma once - 但是,这是非标准扩展名

答案 2 :(得分:5)

虽然pragma曾经在许多方面优于#ifdef守卫,但它有一个主要缺陷:它基于文件系统路径:它使用两个不同(绝对)路径也是两个不同文件的基本假设。不幸的是,这并非总是如此。

虽然你不太可能遇到这个问题,但是要注意这一点。

答案 3 :(得分:3)

关于此的更多背景知识:

答案 4 :(得分:2)

就性能而言,我没有测量它,但是广泛报道编译器认识到#include守护成语并且不重新打开/重新处理使用它的文件(因此将它们视为使用{{1 }})。

除了潜在的性能优势(可能不存在)之外,我看不到#pragma once提供的东西 - 当你创建一个新的标题时它更方便 - 但是卫兵真的不是那么繁重到位。由于#pragma once不是特别引人注目,因为我偶尔会处理不支持它的编译器,所以我使用了警卫。

如果显示#pragma once有显着的效果,我肯定会开始使用它。

那就是说 - 我希望C被定义为只包含一次标题 - 除非调用某种机制来指示每次包含标题时都应该处理标题。你想要这种行为的时间远远超出了你没有的次数(而且我仍然偶尔遇到没有警卫或#pragma once的标题。但它没有这样定义,所以包括卫兵......

答案 5 :(得分:1)

正如Dan McG所说,它们几乎是一样的。但我建议不要使用#pragma,除非在无法避免的事情中(比如#pragma部分)。它只是使代码更加不标准。

并且没有功能/性能问题。因为这是在编译时间。 可能会增加编译时间,但我没有遇到任何差异!

答案 6 :(得分:1)

#pragma once是非标准的。

如果您发现当您尝试将其移植到其他平台时无法构建应用程序或库时,您对更改每个头文件的前景感到满意,那么它可能是一个不错的选择。

否则,坚持使用#ifndef/#define/#endif特别是如果您正在构建供其他人使用的库代码。