従来、C ++での複数のヘッダーのインクルードを回避する標準的で移植可能な方法は、マクロガードスキーム#ifndef - #define - #endifとも呼ばれるプリコンパイラディレクティブスキームを使用することでした(現在のコードスニペットを参照)。
#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以降など)に含める予定はありますか?
- また、誰かがいずれかの手法(つまり、マクロガードと
#pragma once)を使用する際の利点/欠点についてさらに詳しく説明できるとよいでしょう。
#pragma once通常は機能しない状況が発生しました。