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

问题描述 投票:0回答:2

传统上,避免 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
    ),那就太好了。
c++ c++11 macros header-files c++14
2个回答
123
投票

#pragma once
不是 标准。这是一种广泛传播的现象(但并非 通用)扩展,可以使用

  • 如果您对便携性的担忧有限,并且
  • 您可以确保所有包含文件始终位于本地磁盘上。

曾考虑标准化,但被拒绝,因为它 无法可靠地实施。 (当您 可以通过几个不同的远程安装访问文件。)

确保没有包含防护是相当容易的 单一开发中的冲突。对于图书馆来说,可能 被许多不同的开发使用,明显的解决方案是 为包含防护生成大量随机字符 当你创建它时。 (可以设置一个好的编辑器来执行此操作 每当你打开一个新标题时。)但即使没有这个, 我还没有遇到任何冲突的问题 图书馆。


36
投票

标准(N4140草案)第 §16.6 节将

#pragma
指令描述为:

表单的预处理指令

# pragma pp-tokensopt new-line

使实现按照实现定义的方式运行 方式。该行为可能会导致翻译失败或导致 翻译器或生成的程序以不合格的方式运行 方式。任何未被实现识别的编译指示都是 忽略。

基本上,

#pragma once
#pragma
指令的特定于实现的实例,不,它不是标准的。然而。

它通常受到大多数“主要编译器”(包括 GCCClang)的广泛支持,因此有时建议避免包含防护样板。

© www.soinside.com 2019 - 2024. All rights reserved.