#ifndef - #define - #endif
伝統的に、C++で複数のヘッダーインクルードを避けるための標準的で移植性のある方法は、プリコンパイラディレクティブスキームを使用することでした。マクロガードスキーム(以下のコード スニペットを参照してください)。
#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
また、どちらかのテクニック(つまり、マクロガードと)を使用する利点と欠点について、さらに詳しく説明していただけるとありがたいです。
ベストアンサー1
#pragma once
はない標準です。これは広く普及している(ただし普遍的ではない)拡張機能であり、
- 携帯性に関する懸念が限られている場合、
- すべてのインクルード ファイルが常にローカル ディスク上にあることを確認できます。
標準化が検討されましたが、確実に実装できないため却下されました。(複数の異なるリモート マウントからアクセスできるファイルがある場合に問題が発生します。)
単一の開発内でインクルード ガードの競合がないことを確認するのは、かなり簡単です。さまざまな開発で使用される可能性のあるライブラリの場合、明らかな解決策は、インクルード ガードを作成するときに、インクルード ガード用に多数のランダムな文字を生成することです (新しいヘッダーを開くたびに、これを自動的に実行するように優れたエディターを設定できます)。ただし、これを行わなくても、ライブラリ間の競合に関する問題は発生していません。