# 杂注曾经是 C + + 11标准的一部分吗?

传统上,避免 C + + 中多头包含的标准和可移植的方法是/是使用也称为 宏观保障计划#ifndef - #define - #endif预编译器指令方案(参见下面的代码片段)。

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif

然而,在大多数实现/编译器中(见下图) ,有一个更“优雅”的替代方案,它与名为 #pragma once的宏保护方案具有相同的功能。与宏保护方案相比,#pragma once有几个优点,包括代码更少、避免名称冲突,有时还提高了编译速度。

enter image description here

通过一些研究,我意识到尽管几乎所有已知的编译器都支持 #pragma once指令,但是关于 #pragma once指令是否是 C + + 11标准的一部分仍然存在一些混乱。

问题:

  • 有人能澄清一下 #pragma once指令是否是 C + + 11标准的一部分吗?
  • 如果它不是 C + + 11标准的一部分,有没有计划在以后的版本中包含它(例如,C + + 14或更高版本) ?
  • 如果有人能够进一步详细说明使用其中任何一种技术(即,宏保护与 #pragma once)的优缺点,那也是很好的。
49274 次浏览

标准(N3936草案)第16.6节将 #pragma指令描述为:

表单的预处理指令

# pragma pp-tokensopt new-line

导致实现在实现定义的 该行为可能导致翻译失败或导致 翻译器或由此产生的程序表现不一致 实现不能识别的任何实用程序都是 被忽略了。

基本上,#pragma once#pragma指令的一个特定实现实例,不,它不是标准的。

它通常得到大多数“主要编译器”(包括 海湾合作委员会)的广泛支持,因此有时建议避免使用包含保护程序样板。

#pragma once没有标准。它是一个广泛的(但不是 通用)扩展,可以使用

  • 如果您对可移植性的关注是有限的,并且
  • 可以确保所有的包含文件总是在本地磁盘上。

它曾被考虑用于标准化,但遭到了拒绝,因为它 不能可靠地实现 可以通过几个不同的远程挂载访问文件。)

确保没有包含警卫是相当容易的 在单个开发中发生冲突 被许多不同的发展所使用,显而易见的解决方案是 为 include 约束生成大量随机字符 (可以设置一个好的编辑器来为 但是即使没有这个, 我还没有遇到任何问题与冲突之间 图书馆。