定義が重なってしまう問題
複数ファイルでのプログラム開発を行う時、
ヘッダファイルのインクルードに注意する事があります。
ヘッダファイルには、関数のプロトタイプ宣言、
#define定数、typedef定義などが含まれていますが、
ヘッダファイルの中で多数の
ヘッダファイルがインクルードされる場合、
#define定数定義やtypedef定義が重なる事が良くあります。
このような事が起こると、コンパイラが警告やエラーを出します。
これは、プログラムの保守性を下げます。
また、program1.hファイルとprogram2.hがあった場合、
program1.hでは、program2.hをインクルードしていて、
program2.hでは、program1.hをインクルードすると、
インクルードの無限ループが起きてしまうのです。
この場合もコンパイラが警告やエラーを出します。
インクルードガード
このような不具合を解決するための仕組みがインクルードガードです。
program1.h
#ifndef __PROGRAM1_H__
#define __PROGRAM1_H__
ヘッダファイルの中身
#endif
最初にprogram1.hのインクルードがあった場合、
__PROGRAM1_H__ が定義されていないので、
__PROGRAM1_H__ が定義され、
ヘッダファイルの中身をインクルードします。
2回目以降のインクルードがあった場合には、
既に__PROGRAM1_H__が定義されているので、
ヘッダファイルの中身をインクルードしません。
__PROGRAM1_H__という名前は、
それぞれのファイルで別の名前に定義します。
こういった仕組みがあれば、
インクルードによる無限ループや多重定義の心配がなくなります。
#defineで定義される識別子には、
一般的にヘッダファイルのファイル名を大文字にしたモノが使用されます。
#pragma once
上記のような記述を
ヘッダファイル1つ1つに書くのは面倒ですよね。
それを解消してくれるのが、#pragma once です。
visualc++では、プロジェクトにヘッダファイルを新規追加すると、
ヘッダファイルの先頭に
#pragma once と自動で挿入されるようになっています。
これは端的に言えば、インクルードガードが適用されている。
と言う意味になります。
これでヘッダファイル内容の記述に専念する事ができます。
非常に便利なので、消してしまわないようにして下さい。
ただ、この#pragmaと言うキーワードは特別なモノなので、
ほかの開発環境では使えない事もあるでしょう。
その時は上記で説明したような
インクルードガードの記述が必要になります。