を、#include
ガードを、時にはmacro guard
と呼ばれる、を扱うときdouble inclusion
の問題を回避するために使用される特定の構造ですincludeディレクティブヘッダファイルに#includeガードを追加することは、そのファイルを冪等化する1つの方法です。たとえば、あなたがchild.h
ファイルにgrandfather.h
とfather.h
ヘッダファイルを含めることを検討してください。
ファイル "grandfather.h"
#ifndef GRANDFATHER_H
#define GRANDFATHER_H
struct foo {
int member;
};
#endif /* GRANDFATHER_H */
ファイル "father.h"
#include "grandfather.h"
ファイル "child.c" ここ
#include "grandfather.h"
#include "father.h"
、"grandfather.h"
の最初の包含は、マクロGRANDFATHER_H
が定義されるようにします。次に、 "child.c"にfather.h
を含めることによって2回目の "grandfather.h"(father.h
にはgrandfather.h
が含まれます)が含まれる場合、#ifndef
テストはfalseを返し、プリプロセッサーはファイルgrandfather.h
の#endifまでスキップします。 struct fooの2番目の定義です。そしてプログラムは正しくコンパイルされます。
[なぜ#ifndefと#defineがC++ヘッダーファイルで使用されているのですか?](http://stackoverflow.com/questions/1653958/why-are-ifndef-and-define-used-in-c-header -files)編集:この質問はもともとC++にタグ付けされていました。質問への答えは、私が知っている限り、C++とCの場合と同じですが、既に重複して回答しています。 – user2079303
よく私はこれらの未定義の動作を – user3528438
@ user3528438と呼びますが、何に基づいてそれらの未定義の動作を呼びますか? – StoryTeller