气馁的pragma使用GCC

时间:2014-10-16 01:01:11

标签: c++ gcc pragma

几乎所有的C ++程序都需要标头保护,但是在严格执行命名约定时会很痛苦 - 尤其是在重构过程中。当使用GCC(和许多其他编译器)时,我们在预处理器命令#pragma once中有一个替代方案。我所看到的反对使用这个命令的建议(例如在v3.4之前缺乏支持)对我的个人项目来说并不十分有说服力。如果可能,我想使用#pragma once

所有这一切,来自the GCC website的引用让我停下来:

  

请注意,一般情况下我们不建议使用编译指示;有关详细说明,请参阅Function Attributes

也许这只是我的低级熟练程度级别的C ++体验,但我在该链接指向的网站上没有看到任何解释。是否有人能够以(半)外行的方式解释他们推荐的理由?

2 个答案:

答案 0 :(得分:5)

一般建议来自这样一个事实:不仅不能保证其他编译器实现#pragma once(或任何其他编译指示),也不能保证其他编译器实现#pragma once GCC也一样。另一个编译器可以合法地给它一个完全不同的含义,或者更糟糕的是,它是一个微妙的不同的含义如果您不关心您的代码是否可移植,则可以忽略该建议。

就个人而言,我只是在我自己的标题中使用普通的#ifndef / #define包含警卫,即使对于我自己的个人项目也是如此。打字并不是那么多,并且保证可以在任何地方工作。与保护宏的命名冲突对我来说从来都不是问题,我尽量不担心我没有的问题。

答案 1 :(得分:2)

我曾经对各种C ++编译器的文档进行了调查,这是调查的结果:

#if defined (_MSC_VER) \
    || (defined (__BORLANDC__) && __BORLANDC__ >= 0x0650) \
    || (defined (__COMO__) && __COMO_VERSION__ >= 400) /* ??? */ \
    || (defined (__DMC__) && __DMC__ >= 0x700) /* ??? */ \
    || (defined (__clang__) && __clang_major__ >= 3) \
    || (defined (__GNUC__) && (__GNUC__ >= 4 \
    || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)))
# define LOG4CPLUS_HAVE_PRAGMA_ONCE
# pragma once
#endif

如您所见,每个主要编译器都支持#pragma once。这由Wikipedia page of #pragma once证实。

因此,回答最初的问题,pragma的问题在于它们是非常符合编译器的。由于便携性原因,这种方式通常是不受欢迎的。 OTOH,几乎所有的C ++编译器都支持这个特殊的编译指示。使用它不会感觉不好。