1. ホーム
  2. c++

[解決済み] かつて#pragmaはC++11の標準に含まれていたのか?

2022-04-28 16:49:32

質問

従来、C++で複数のヘッダをインクルードすることを避けるための標準的で移植性の高い方法は、(1). #ifndef - #define - #endif と呼ばれるプリコンパイラディレクティブスキーム。 マクロガード方式 (下記のコードスニペットを参照)。

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
...
#endif

しかし、ほとんどの実装やコンパイラでは(下の図を参照)、マクロガード方式と同じ目的を果たす、より "elegant" な代替案があります。 #pragma once . #pragma once は、マクロガード方式と比較して、コードが少なく、名前の衝突が避けられ、時にはコンパイル速度が向上するなど、いくつかの利点があります。

調べてみると #pragma once ディレクティブはほとんどすべての既知のコンパイラでサポートされていますが #pragma once ディレクティブは C++11 標準の一部であるかどうか。

質問です。

  • を明確にすることができます。 #pragma once ディレクティブは C++11 標準の一部なのですか?
  • C++11標準に含まれていない場合、それ以降のリリース(C++14以降など)に含める予定はありますか?
  • また、どちらかのテクニックを使用した場合の利点/欠点について、誰かがさらに詳しく説明してくれるとうれしいです (つまり、マクロガードと #pragma once ).

解決方法は?

#pragma once ではない を標準装備しています。 これは広く普及している(ただし 普遍的な)拡張機能であり、使用することができます。

  • 移植性の懸念が限定的な場合、および
  • は、すべてのインクルードファイルが常にローカルディスクにあることを確認することができます。

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

インクルードガードがないことを確認するのは、かなり簡単です。 の競合が発生します。 ライブラリの場合、それは 多くの異なる開発で使用される場合、明らかな解決策は インクルードガードにランダムな文字を大量に生成することで を作成するときです。 (良いエディタであれば、この作業を行うように設定することができます。 新しいヘッダーを開くときはいつもそうです)。 しかし、そうでなくとも というような問題にはまだ遭遇していません。 のライブラリがあります。