【发布时间】:2014-07-04 22:56:34
【问题描述】:
传统上,避免在 C++ 中包含多个标头的标准且可移植的方法是使用 #ifndef - #define - #endifpre-compiler 指令方案,也称为 macro-guard scheme(参见下面的代码 sn-p)。
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif
然而,在大多数实现/编译器(见下图)中,有一个更“优雅”的替代方案,其用途与称为#pragma once 的宏保护方案相同。 #pragma once 与宏守卫方案相比有几个优点,包括更少的代码、避免名称冲突以及有时提高编译速度。
做了一些研究,我意识到尽管几乎所有已知的编译器都支持#pragma once 指令,但#pragma once 指令是否是 C++11 标准的一部分还不清楚。
问题:
- 有人能澄清
#pragma once指令是否属于C++11 标准吗? - 如果它不是 C++11 标准的一部分,是否有计划将其包含在更高版本(例如 C++14 或更高版本)中?
- 如果有人能进一步详细说明使用其中任何一种技术的优点/缺点(例如,macro-guard 与
#pragma once),那就太好了。
【问题讨论】:
-
顺便说一句,标准禁止使用双下划线作为标头保护,该标准为实现保留所有以双下划线开头的符号(除了其他符号)。
-
也禁止使用前导下划线后跟大写字母。二、浊度在哪里?我只看到了编译器支持,没有人声称它是标准的一部分?
-
对于第三个要点,请查看相关问题:Is #pragma once a safe include guard? 它有一种情况,标题保护工作但
#pragma once通常不工作。 -
possible duplicate 因为它回答了这个问题而没有提及 C++11。
-
嗯,官方文档中没有编码,但是你可以将其视为de facto标准。
标签: c++ c++11 macros header-files c++14