0

ファイルfile.hには、次のコードが表示されます。

#ifndef FILE_H
#define FILE_H
 ...
 ...
#endif

質問: FILE_H を生成したのは誰ですか (FILE_H は識別子と呼ばれますか?) この命名規則は何と呼ばれますか? これをもっと理解するには何を読むべきですか?

現時点では、これはインクルード ガードと呼ばれ、プリプロセッサと関係があることを知っています。しかし、私はさらにグーグルすることができないようです。リンクは大歓迎です。

4

1 に答える 1

0

インクルード ガードは、実際には言語自体の機能ではなく、同じヘッダー ファイルが同じ翻訳単位に 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 つがまったくインクルードされないことがあります。これはあまり頻繁に発生しないため、通常は気にする必要はありません。

于 2015-08-03T02:00:22.663 に答える