pit-rayの備忘録

知識のあうとぷっと

【C言語】ヘッダファイル二重定義防止

今回は基本的なことの整理です。

C言語でファイルが複数になるとヘッダファイルなどを用いて関数の管理などをすることになると思います。
しかし、ここで気を付けないといけないのが二重定義と呼ばれるものです。


通常、ヘッダファイルはソースファイルに
#include "header_1.h"
と読み込みますが、ここで複数のソースファイルにそれぞれ同じヘッダファイルを読み込んでいた場合、二重定義になってしまいます。つまり、ヘッダファイルが二回読み込まれているのです。

それを回避するためにプリプロセッサ指令と呼ばれるものがあります。
以下によく使うものを記載します。

プリプロセッサ命令 機能
#include <ファイル名>or "ファイル名(パス)" ファイルの読み込み
#define 識別子 値 識別子の定義(文字列の置換)
#ifdef 識別子 識別子が定義されているならば~
#ifndef 識別子 識別子が定義されていないならば~
#endif ~終わり。

これを用いて二重定義を防止するためには以下のように書きます。(他にもあると思いますが...)

#ifndef   HEADER_H
#define HEADER_H
/*<処理>*/
#endif

このように書くと、初ヘッダファイル読み込みの場合は、まだHEADER_Hという識別子は定義されていないので<処理>が実行されます。その後、ヘッダファイルを二重に読み込んだ場合は、既に一回目でHEADER_Hという識別子が定義されているので<処理>が実行されません。このようにして二重定義を回避できます。

その為、ifdefとifndefを間違えないように注意してください。nがあるかないかで処理が真逆になるので。

以上。