header file のおまじない


header file の冒頭と最後にこんなおまじないを書くことが多いです。

#ifndef __FILENAME_H__
#define __FILENAME_H__

/* ファイルの中身 */

#endif /* !defined(__FILENAME_H__) */
このおまじないは、同じ宣言を 2 度以上読み込まないようにするためのものです。 もし、この header file を同じ XXX.c file から 2 度読み込んだ場合でも、 2 度目の読み込みにおいては、すでに __FILENAME_H__ が define されている ので、2 度読み防止できるわけです。

同じ XXX.c ファイルから同じ header file を直接 2 回読み込むことは、 まあないでしょう。 ただ、header file で別の header file を include することもあるわけです。 例えば、コンポーネント B は、コンポーネント A を利用しており、 コンポーネント B を利用する場合は必ずコンポーネント A の宣言群を取り込む必要 があるとします。

この場合、コンポーネント B の作成者は、その B.h 中に、

/* B.h 中に、 */
#include "A.h"
と書くわけです。これとは別に、 コンポーネント B ユーザが直接 A.h を取り込んでいる場合、 A.h が 2度取り込まれる おそれがあるというわけです。

2001.10.29/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp