#pragma once は C++11 標準の一部ですか? 質問する

#pragma once は C++11 標準の一部ですか? 質問する

#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ない標準です。これは広く普及している(ただし普遍的ではない)拡張機能であり、

  • 携帯性に関する懸念が限られている場合、
  • すべてのインクルード ファイルが常にローカル ディスク上にあることを確認できます。

標準化が検討されましたが、確実に実装できないため却下されました。(複数の異なるリモート マウントからアクセスできるファイルがある場合に問題が発生します。)

単一の開発内でインクルード ガードの競合がないことを確認するのは、かなり簡単です。さまざまな開発で使用される可能性のあるライブラリの場合、明らかな解決策は、インクルード ガードを作成するときに、インクルード ガード用に多数のランダムな文字を生成することです (新しいヘッダーを開くたびに、これを自動的に実行するように優れたエディターを設定できます)。ただし、これを行わなくても、ライブラリ間の競合に関する問題は発生していません。

おすすめ記事