UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

C言語の基本的なテクニック - インクルードガード

f:id:mochizuki_p:20161221101748p:plain

C言語のライブラリには、通常以下のようなマクロが設定されている

メルセンヌツイスタライブラリ(mt19937.h)より

#ifndef MT19937_H_
#define MT19937_H_

//ここにヘッダファイルの本体

##endif

そしてこのマクロが具体的にどのように役に立つのであろうか?それは、C言語のヘッダファイルでしばしば使われる関数の重複定義(コンパイル時間が無駄に増加する) を防ぐための工夫である。

それは、ソフトウェアの規模が大きくなり、沢山のヘッダファイルを利用するようになると、同じヘッダファイルを何度も展開する。といったことが発生します。

また同じプログラムで同じ処理を繰り返し行うことになり、コンパイル時間の増大とともエラーの発生を誘発します。

これを避けるためにインクルードガードと呼ばれる手法を行うのが一般的です。

#ifndef TEST__H_
#define TEST__H_

//ここにヘッダファイルの内容を書き込む

#endif /* TEST__H_

これが実際にどのように働くのだろうか?

#ifndef は指定したマクロ変数が定義されていないときに、 #endifで囲まれた部分を出力する。もし最初にこのヘッダファイルが読み込まれた時点ではTESTH_は定義されていないため、#ifndef以下の内容が展開される。一方2度目以降の呼び出し時は、すでにTESTH_が定義されているために、ヘッダファイルの内容は展開されず、したがって2重インクルードの問題は発生しない。

注意点としては、 _(アンダバーで始まるマクロ変数はシステム予約語としてリザーブされていますので利用しないようにする。ということです。)