ヘッダー ファイルのインクルード ガードは、コードのセクションを二重インクルードから保護するためによく使用されます。
#ifndef FOOBAR_H
#define FOOBAR_H
extern void myfoofunc(void);
#endif
通常、インクルード ガードは、オブジェクトのようなマクロが既に定義されている場合、ブロック内の行がインクルードされないという期待に依存しています#ifndef
。したがって、二重インクルードを回避します。
#define
多くのインクルード ヘッダーの行に空の置換リストがあることに気付きました。C99 標準は、空の置換リストで定義されたオブジェクトのようなマクロが によって「定義された」と見なされることを保証します#ifndef
か?
の構文を説明するとき、C99 標準は、セクション 6.10.3 パラグラフ 9#define
で replacement-list が必要であることを暗示しているようです。
フォームの前処理ディレクティブ
# 識別子置換リストの改行を定義
マクロ名の後続の各インスタンスを、ディレクティブの残りの部分を構成する前処理トークンの置換リストに置き換える、オブジェクトのようなマクロを定義します。次に、以下に指定されているように、置換リストを再スキャンして、さらに多くのマクロ名を探します。
これは、代わりにインクルード ヘッダーを次の形式にする必要があることを意味します#define FOOBAR_H 1
か?