従来、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
通常は機能しない状況が発生しました。