#pragma曾经#if!定义了MYHEADER_INCLUDED_

bdh*_*har 12 include c-preprocessor

可能重复:
#pragma一次vs包括警卫?

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

Dan*_*ath 16

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

来自文章

在C和C++编程语言中,#pragma once是一种非标准但广泛支持的预处理器指令,旨在使当前源文件仅在单个编译中包含一次.

因此,#pragma once起到与#include守卫相同的作用,但具有几个优点,包括:减少代码,避免名称冲突,以及提高编译速度.

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


Kor*_*icz 7

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

  • #pragma一天成为标准,我的生活会变得更好一点. (2认同)
  • 那天"#pragma once"变得不必要,我的生活会变得更好一点. (2认同)

Ond*_*nde 5

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

虽然你不太可能遇到这个问题,但需要注意的是.