「冗長インクルードガード」は、あなたがそれを呼ぶように、コンパイルをスピードアップします。
冗長ガードがないと、コンパイラはfoo.hファイル全体を反復処理し、#ifndef
ブロック外にある可能性のあるコードを探します。それが長いファイルであり、これが多くの場所で行われる場合、コンパイラーは多くの時間を浪費する可能性があります。#include
ただし、冗長ガードを使用すると、ステートメント全体をスキップでき、そのファイルを再度開くこともできません。
もちろん、コンパイラがfoo.hを反復処理し、実際には何もコンパイルしないことによって浪費される実際の時間を実験して確認する必要があります。そしておそらく、最近のコンパイラは実際にこのパターンを探して、ファイルをまったく開かないことを自動的に知っています、私にはわかりません。
(280Z28で編集を開始)
次のヘッダー構造は、少なくともGCCとMSVCによって認識されます。このパターンを使用すると、インクルードファイルのガードで得られる実質的にすべての利点が無効になります。コンパイラが構造を調べるとき、コメントは無視されることに注意してください。
// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED
// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// header text goes here.
#endif
(編集終了)