2009-10-31 3 views
321

C++ヘッダーファイルで#ifndefと#defineを使用するのはなぜですか?私は、ヘッダファイルの先頭には通常、このようなコードを見てきた

#ifndef HEADERFILE_H 
#define HEADERFILE_H 

し、ファイルの末尾には、この目的は何

#endif 

のですか?

+22

+1 - 私も同じ疑いがありましたが、ここでもっと良い答えが得られ、将来の訪問者には便利かもしれません:http://stackoverflow.com/q/3246803/1134940 –

+5

私はこれに追加したいと思います** #pragma once **を使用すると、それだけで済むので、ifndefと同じ目的を果たします。両者を比較するには、以下を参照してください。http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards – Dimension

+2

'#pragma'はコンパイラ固有の機能を有効にします。 '#pragma once'は広くサポートされていますが、非標準です。 – Potatoswatter

答えて

369

これらは、#include guardsと呼ばれます。

ヘッダーが含まれると、一意の値(この場合はHEADERFILE_H)が定義されているかどうかを確認します。それが定義されていない場合は、それを定義して残りのページに進みます。

コードが再度含まれると、最初のifndefが失敗し、空白のファイルになります。

これは、型、列挙型、静的変数などの識別子の二重宣言を防止します。与えられたトークンが以前のファイルまたはインクルードファイル内#definedされたかどうか

+3

Mmm interresting。私は一度VC++を辞めました。私はObjective-Cコーダーです。) –

+0

コーディングBaard XIV:VCでも同じことをする '#pragma once'があります:-) – Joey

+63

また、再帰的なインクルージョンを防ぐ..." alice.h " bob.h "と" bob.h "には" alice.h "が含まれていて、彼らにはガードが含まれていません... –

21
#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 
+3

アンダースコアで始まる識別子は予約済みです。自分で定義するべきではありません。 '#ifndef H_HEADER_NAME'のようなものを使用してください。 –

+5

これは古いコメントですが、実際にはアンダースコアの制限はコンパイル済みオブジェクトのシンボルテーブルに終わる可能性のある識別子、つまりグローバル変数や関数名などの「外部識別子」にのみ適用されます。マクロ名には適用されません。 – Stu

+1

Stuさんのコメントは本当ですか?私はちょうどhttps://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifierを読んで、今私は確信していません。 – Will

2

これは、複数の同じヘッダファイルを複数回含むことを防止します。

#ifndef __COMMON_H__ 
#define __COMMON_H__ 
//header file content 
#endif 

このヘッダーファイルを複数のファイルに含めるとします。したがって、最初に __COMMON_H__が定義されていない場合、定義され、ヘッダファイルが含まれます。

次回は__COMMON_H__が定義されているので、再び含まれません。

関連する問題