C++におけるダブルインクルードガードの使用
質問
ということで、最近、私の仕事場では、私が疑問に思っていた ダブル インクルードガードの使用に疑問を投げかけました。私が言いたいのは ダブルガード は次のようになります。
ヘッダーファイル、"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
以下はその理由です。
-
二重インクルージョンを避けるには、ヘッダーファイル自体の中に通常のインクルードガードを追加すれば十分です。これはうまく機能します。インクルードの場所に別のインクルードガードがあると、コードが混乱し、可読性が低下するだけです。
-
不必要な依存関係を追加してしまう。ヘッダファイル内のインクルードガードを変更する場合は をすべて で変更する必要があります。
-
これは、コンパイル/リンクのプロセス全体を比較すると、間違いなく最も高価な操作ではないので、ビルドの総時間を減らすことはほとんどできません。
-
価値のあるコンパイラは はすでにファイル全体のインクルードガードを最適化しています。 .
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] #pragma once vs include guards? 重複
-
[解決済み] かつて#pragmaはC++11の標準に含まれていたのか?