:C++ヘッダーファイルで#ifndefと#defineを使用するのはなぜですか?私は、ヘッダファイルの先頭には通常、このようなコードを見てきた
#ifndef HEADERFILE_H
#define HEADERFILE_H
し、ファイルの末尾には、この目的は何
#endif
のですか?
:C++ヘッダーファイルで#ifndefと#defineを使用するのはなぜですか?私は、ヘッダファイルの先頭には通常、このようなコードを見てきた
#ifndef HEADERFILE_H
#define HEADERFILE_H
し、ファイルの末尾には、この目的は何
#endif
のですか?
これらは、#include guardsと呼ばれます。
ヘッダーが含まれると、一意の値(この場合はHEADERFILE_H
)が定義されているかどうかを確認します。それが定義されていない場合は、それを定義して残りのページに進みます。
コードが再度含まれると、最初のifndef
が失敗し、空白のファイルになります。
これは、型、列挙型、静的変数などの識別子の二重宣言を防止します。与えられたトークンが以前のファイルまたはインクルードファイル内#defined
されたかどうか
Mmm interresting。私は一度VC++を辞めました。私はObjective-Cコーダーです。) –
コーディングBaard XIV:VCでも同じことをする '#pragma once'があります:-) – Joey
また、再帰的なインクルージョンを防ぐ..." alice.h " bob.h "と" bob.h "には" alice.h "が含まれていて、彼らにはガードが含まれていません... –
#ifndef <token>
/* code */
#else
/* code to include if the token is defined */
#endif
#ifndef
チェックします。そうでない場合は、#else
を閉じるか、#else
が存在しない場合は#endif
の文が含まれます。 #ifndef
は、ファイルがインクルードされた後にトークンを定義し、そのファイルの先頭にトークンが設定されていないことを確認することによって、ヘッダファイルを冪等化するためによく使用されます。
#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif
アンダースコアで始まる識別子は予約済みです。自分で定義するべきではありません。 '#ifndef H_HEADER_NAME'のようなものを使用してください。 –
これは古いコメントですが、実際にはアンダースコアの制限はコンパイル済みオブジェクトのシンボルテーブルに終わる可能性のある識別子、つまりグローバル変数や関数名などの「外部識別子」にのみ適用されます。マクロ名には適用されません。 – Stu
Stuさんのコメントは本当ですか?私はちょうどhttps://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifierを読んで、今私は確信していません。 – Will
これは、複数の同じヘッダファイルを複数回含むことを防止します。
#ifndef __COMMON_H__
#define __COMMON_H__
//header file content
#endif
このヘッダーファイルを複数のファイルに含めるとします。したがって、最初に __COMMON_H__が定義されていない場合、定義され、ヘッダファイルが含まれます。
次回は__COMMON_H__が定義されているので、再び含まれません。
+1 - 私も同じ疑いがありましたが、ここでもっと良い答えが得られ、将来の訪問者には便利かもしれません:http://stackoverflow.com/q/3246803/1134940 –
私はこれに追加したいと思います** #pragma once **を使用すると、それだけで済むので、ifndefと同じ目的を果たします。両者を比較するには、以下を参照してください。http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards – Dimension
'#pragma'はコンパイラ固有の機能を有効にします。 '#pragma once'は広くサポートされていますが、非標準です。 – Potatoswatter