インクルード ガードは、実際には言語自体の機能ではなく、同じヘッダー ファイルが同じ翻訳単位に 2 回インクルードされないようにするための手段にすぎず、下位レベルの言語機能から構築されています。
これを可能にする実際の機能は、マクロ置換 (特にオブジェクトのようなマクロ) と条件付き包含です。
したがって、 がどこからFILE_H
来たのかを調べるには、2 つのことを調べる必要があります。
1 つ目は、標準によって課される制限です (C11 6.4.2
たとえば)。マクロ置換では、マクロ名は、大文字と小文字、アンダースコア、および数字を最小限に含む制限された文字セットから抽出する必要があります (ユニバーサル文字など、許可できるあらゆる種類の追加文字があります)。名前またはその他の実装定義の文字ですが、これは義務付けられたベースラインです)。
2つ目は、開発者の心です。標準の制約を超えて、開発者はインクルード ガードに使用される一意の識別子を提供する必要があります。これを行う最も簡単な方法は、何らかの方法でファイル名自体に依存させることです。したがって、大文字のファイル名を.
アンダースコアに置き換えて使用するのが 1 つの方法です。
btree.h
そのため、次の形式のインクルード ガードが必要になります。
#ifndef BTREE_H
#define BTREE_H
// weave your magic here
#endif
ただし、常にうまくいくとは限らないことを念頭に置いておく必要があります。場合によっては、同じインクルード ガード名を使用する 2 つの同様の名前のヘッダー ファイルが作成され、その結果、ヘッダー ファイルの 1 つがまったくインクルードされないことがあります。これはあまり頻繁に発生しないため、通常は気にする必要はありません。