インクルードガードでUUIDを使用する

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

CやC++ではヘッダーファイルをインクルードする際に、一度インクルードされたヘッダファイルの内容を何度もインクルードされないように ((CやC++では変数や関数などを使用する際に定義を書かれたヘッダファイルを読み込む必要があり、#includeがそれに当たるのだが、基本的にはそれが指定されていれば何度も読み込まれてしまい、そのままでは変数名や関数名の衝突を起こしてコンパイルエラーが発生してしまう)) 以下の様なコードを書いて多重インクルードがされないようにしている。

[code lang=”c”]#ifndef __HOGE_H_
#define __HOGE_H_
// (defineとendifの間に定義を記述する)
#endif[/code]

多くの場合は、インクルードガードの定義にはプロジェクト名やヘッダファイル名、もしくはオブジェクト名を使用しているが、この場合、別のディレクトリに同じファイル名やクラス名などがあったりして衝突したり、それらを改名した際に手間がかかるなど、場合によっては問題となりうる。

私の場合、趣味で(CやC++で)プログラムを行う際は「#include ガードにファイル名を入れるのは止めませんか? – masugata_kの日記」を参考にして、以下のようにUUIDを使ってインクルードガードを定義している。そうすれば、余程のことがない限りUUIDが衝突することもなく、ファイル名を変更した際にも修正する必要性はない。

[code lang=”c”]#ifndef INCLUDE_GUARD_UUID_381F16FD_3AC0_4352_976A_952CE2B98922
#define INCLUDE_GUARD_UUID_381F16FD_3AC0_4352_976A_952CE2B98922
// この部分に(ry
#endif[/code]

ただし、UUIDを使用する場合、Unix系環境でuuidgen等でUUIDを生成しなければならないが、多くの場合、生成されるUUIDは「06BEB9CD-544C-4893-981E-0AE820C17800」といった感じになる。このままではハイフンが悪影響を及ぼして正常に使用できないので、ハイフンをアンダースコアなどに置き換えなければならない。置き換えた後、必要であればプレフィックスなどをつければインクルードガードとして使えるようになる。

ただし、そうするには面倒なので、以下の様なシェルスクリプトを作成して使用すれば多少は面倒さは軽減される ((bashの場合)) 。

[code lang=”bash”]#!/bin/sh

UUID=`uuidgen`
echo "INCLUDE_GUARD_UUID_${UUID//-/_}"[/code]

タイトルとURLをコピーしました