|
2重インクルード防止
プログラムが大きくなってくると、ヘッダファイルの数もだんだん増えてきます。ヘッダファイルの中で他のヘッダファイルをインクルードして、それをソースファイルにインクルードして…ということを繰り返していると、だんだんごちゃごちゃになってきて収集がつかなくなってきます。
そうならないように最初から、新しいヘッダファイルを作ったらここにインクルードを追加する…といったようなルールを決めておくべきでしょう。
さて、ヘッダファイルは2重にインクルードすると、関数やdefineの定義の重複でコンパイルエラーになります。しかし、これはヘッダファイルに次のような記述を書いておくと回避することができます
#ifndef _SAMPLE
#define _SAMPLE
// ヘッダファイルの中身
// 関数宣言 defineなど...
#endif // _SAMPLE
|
これはプリプロセッサの機能を使って2重インクルードできないようにしています。上の例で言うと、1回目にインクルードしたときは_SAMPLEが定義されていないので、ヘッダファイルの中身がそのまま有効になります。2回目にインクルードしたときはすでに1回目に_SAMPLEが定義されているので、ヘッダファイルの中身はコンパイル時に無視されます。
これで、何度インクルードしてもヘッダファイルの中身は1回分しかインクルードされなくなります。これはかなり一般的に使われているテクニックです。Cの標準ヘッダなどでも使われています。(stdio.hなどを何度インクルードしてもエラーにならないのはそのためです。)
ヘッダファイルには必ずこのような記述を書くことを習慣にしましょう。もちらんこれに頼らずに、2重インクルードしないようなインクルード方法のルールを決めておくことが重要です。
さて、microsoftのcコンパイラの場合は次のような方法でも2重インクルードを防止することができます。
#pragma once
// ヘッダファイルの中身
// 関数宣言 defineなど...
|
これはmicrosoftのcコンパイラ独自のプラグマを使っています。
|