C ++では、C++プログラムのヘッダーガードの目的は何ですか。
ネットから私はそれがファイルを何度も含めるのを防ぐためのものであることがわかりましたが、ヘッダーガードはこれをどのように保証しますか?
C ++では、C++プログラムのヘッダーガードの目的は何ですか。
ネットから私はそれがファイルを何度も含めるのを防ぐためのものであることがわかりましたが、ヘッダーガードはこれをどのように保証しますか?
ガードヘッダー(またはより一般的には「インクルードガード」)は、ヘッダーファイルが複数回インクルードされた場合の問題を防ぐためのものです。例えば
#ifndef MARKER
#define MARKER
// declarations
#endif
このファイルが初めて#include
-edされると、MARKER
プリプロセッサシンボルは未定義になるため、プリプロセッサがシンボルを定義し、コンパイラから見たソースコードに次の宣言が含まれます。後続#include
の'で、MARKER
シンボルが定義されるため、#ifnde
/内のすべて#endif
がプリプロセッサによって削除されます。
これが正しく機能するためには、-edMARKER
される可能性のあるヘッダーファイルごとにシンボルが異なる必要があります。#include
このようなことが必要な理由は、C / C ++では、コンパイル単位で同じ名前の型または関数を複数回定義することは違法であるためです。ガードを使用すると#include
、すでにインクルードされているかどうかを気にせずにヘッダーファイルを作成できます。ガードがないと、同じヘッダーファイルを複数インクルードすると、不要な再宣言やコンパイルエラーが発生します。これは、ヘッダーファイルが他のヘッダーファイルに必要な場合に特に役立ち#include
ます。
要するに、それはあなたが何度も何度もファイルを作成することを妨げるものではありません。#include
むしろ、コンパイルエラーを発生させることなくこれを行うことができます。
ヘッダーガードの目的は、一部のコードが翻訳単位ごとに1回だけ表示される可能性がある問題を防ぐことです。
一例は構造体です。2番目の定義が同一であっても、構造体を再定義することはできません。したがって、以下をコンパイルしようとすると、次のようになります。
struct foo { int x; };
struct foo { int x; };
再定義のため、コンパイラは失敗します。
ヘッダーを1回だけ含めることを保証するのは難しい場合があります(これは、ヘッダーに他のヘッダーが含まれている場合に発生します)。ヘッダーに構造体定義がある場合、これによりコンパイルが失敗します。ヘッダーガードは簡単なトリックであるため、ヘッダーが複数回含まれている場合でも、その内容は1回だけ表示されます。