13

C ++では、C++プログラムのヘッダーガードの目的は何ですか。

ネットから私はそれがファイルを何度も含めるのを防ぐためのものであることがわかりましたが、ヘッダーガードはこれをどのように保証しますか?

4

2 に答える 2

24

ガードヘッダー(またはより一般的には「インクルードガード」)は、ヘッダーファイルが複数回インクルードされた場合の問題を防ぐためのものです。例えば

#ifndef MARKER
#define MARKER
// declarations 
#endif

このファイルが初めて#include-edされると、MARKERプリプロセッサシンボルは未定義になるため、プリプロセッサがシンボルを定義し、コンパイラから見たソースコードに次の宣言が含まれます。後続#includeの'で、MARKERシンボルが定義されるため、#ifnde/内のすべて#endifがプリプロセッサによって削除されます。

これが正しく機能するためには、-edMARKERされる可能性のあるヘッダーファイルごとにシンボルが異なる必要があります。#include

このようなことが必要な理由は、C / C ++では、コンパイル単位で同じ名前の型または関数を複数回定義することは違法であるためです。ガードを使用すると#include、すでにインクルードされているかどうかを気にせずにヘッダーファイルを作成できます。ガードがないと、同じヘッダーファイルを複数インクルードすると、不要な再宣言やコンパイルエラーが発生します。これは、ヘッダーファイルが他のヘッダーファイルに必要な場合に特に役立ち#includeます。


要するに、それはあなたが何度も何度もファイルを作成することを妨げるものではありません。#includeむしろ、コンパイルエラーを発生させることなくこれを行うことができます。

于 2010-06-05T06:20:48.567 に答える
2

ヘッダーガードの目的は、一部のコードが翻訳単位ごとに1回だけ表示される可能性がある問題を防ぐことです。

一例は構造体です。2番目の定義が同一であっても、構造体を再定義することはできません。したがって、以下をコンパイルしようとすると、次のようになります。

struct foo { int x; };
struct foo { int x; };

再定義のため、コンパイラは失敗します。

ヘッダーを1回だけ含めることを保証するのは難しい場合があります(これは、ヘッダーに他のヘッダーが含まれている場合に発生します)。ヘッダーに構造体定義がある場合、これによりコンパイルが失敗します。ヘッダーガードは簡単なトリックであるため、ヘッダーが複数回含まれている場合でも、その内容は1回だけ表示されます。

于 2010-06-05T06:56:01.150 に答える