【问题标题】:Did `#pragma once` make it into C++0x?`#pragma once` 是否进入了 C++0x?
【发布时间】:2011-06-01 14:12:03
【问题描述】:

标题说明了一切。 #pragma once 是否已针对 C++0x 进行了标准化?我不知道任何编译器不提供它的实现,几乎总是具有相同的语义和名称。

【问题讨论】:

  • “几乎”?您可以在不同的编译器中使用它吗?或者,你还知道哪些其他名字? (不清楚“几乎”适用于哪一个,或两者兼而有之?)

标签: c++ c++11 c-preprocessor pragma


【解决方案1】:

所有#pragma 指令都会导致实现以实现定义的方式运行。

这在 C++03 和最新的 C++0x 草案 (n3225.pdf) 之间没有改变。包括警卫是便携式替代品。

【讨论】:

  • 我知道警卫是便携式替代品,但我认为无论如何它都可以标准化。
  • 注意最新的草稿是n3225.pdf。
  • @Prasoon:原来如此。在我看来,WG21 网页上的“当前草案”不是最新的。 open-std.org/jtc1/sc22/wg21
  • 好的,#pragma once 可能会导致问题,但我想知道 - 为什么不考虑使用用户指定 ID 的其他替代方案,例如 #pragma once ID?还是只有我对那些复制粘贴的 ifdef-define-endif 行感到厌恶?..
  • 如果一种#pragma曾经成为标准,那不会强迫你在所有文件上使用它,所以我看不出将它添加到标准中的问题(除了给它非编译指示名称)。
【解决方案2】:

Sun C++ 编译器 (Solaris) 没有实现它。不,它不在 C++0x 草案中。

【讨论】:

    【解决方案3】:

    使用#ifdef 实现也很简单。新版本的指导原则是什么?实现您可能想要的一切和厨房水槽,还是只为您提供最少的工具来自己实现?

    【讨论】:

    • 你没有抓住重点。标准化的很大一部分是使通用实践成为符合标准的工具的最低限度。正如许多编译器提供的#pragma once 一样,并且已被证明是有用的。关键字等效标准化会有所帮助。
    • include 守卫强制你在(一个也是唯一的全局)预处理器命名空间中选择名称。这是一种痛苦。当然,大多数项目在某个地方都需要宏,所以他们已经处理了选择预处理器标识符的问题,而不会导致冲突。尽管如此,这很痛苦,而且我仍然看到很多#ifdef FILENAME_H 代码飞来飞去。这是ARGH。大多数明智的项目都使用 PROJECTNAME_FILENAME_SOMESUFFIX,这还不错,但是...。 IMO #pragma once 是更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    相关资源
    最近更新 更多