1. ホーム
  2. c++

C++におけるダブルインクルードガードの使用

2023-12-24 22:47:39

質問

ということで、最近、私の仕事場では、私が疑問に思っていた ダブル インクルードガードの使用に疑問を投げかけました。私が言いたいのは ダブルガード は次のようになります。

ヘッダーファイル、"header_a.hpp"です。

#ifndef __HEADER_A_HPP__
#define __HEADER_A_HPP__
...
...
#endif

ヘッダファイルやソースファイルなど、任意の場所にインクルードする場合。

#ifndef __HEADER_A_HPP__
#include "header_a.hpp"
#endif

ヘッダーファイルでのガードの使用は、すでに定義されているヘッダーファイルの多重インクルージョンを防ぐためであり、一般的でよく知られたことだと理解しました。マクロがすでに定義されている場合、ヘッダーファイル全体はコンパイラによって「空白」とみなされ、二重インクルージョンが防止されます。十分にシンプルです。

私が理解していない問題は #ifndef __HEADER_A_HPP__#endif の周りに #include "header_a.hpp" . 私は同僚から、これは介在物に対する保護の第二層を追加すると聞きましたが、第一層が絶対に仕事をする(あるいはする)場合、第二層がどのように有用であるのかさえわかりません。

私が思いつく唯一の利点は、リンカーがわざわざファイルを見つけるのを完全に止めることです。これはコンパイル時間を改善するためのものなのか (これは利点として言及されていません)、それとも私が見ていない何か他のものがここで働いているのでしょうか?

どのように解決するのですか?

のようなインクルードガードをもう一つ追加するのは悪い習慣であることは確かです。

#ifndef __HEADER_A_HPP__
#include "header_a.hpp"
#endif

以下はその理由です。

  1. 二重インクルージョンを避けるには、ヘッダーファイル自体の中に通常のインクルードガードを追加すれば十分です。これはうまく機能します。インクルードの場所に別のインクルードガードがあると、コードが混乱し、可読性が低下するだけです。

  2. 不必要な依存関係を追加してしまう。ヘッダファイル内のインクルードガードを変更する場合は をすべて で変更する必要があります。

  3. これは、コンパイル/リンクのプロセス全体を比較すると、間違いなく最も高価な操作ではないので、ビルドの総時間を減らすことはほとんどできません。

  4. 価値のあるコンパイラは はすでにファイル全体のインクルードガードを最適化しています。 .