• ベストアンサー

#ヘッダーファイルの2重インクルード防止コードについて

「ローベルのC++入門講座」という本を読んでいるのですが、 その中でヘッダーファイルの2重インクルードを回避するマクロとして、 ---------------------------------------------------------------- #ifndef REDEF1_H_20070101_1138_JOIE93UL_INCLUDED_ #define REDEF1_H_20070101_1138_JOIE93UL_INCLUDED_ const int N = 10; ・ ・ ・ #endif ---------------------------------------------------------------- というサンプルがでてくるのですが、 「REDEF1_H_20070101_1138_JOIE93UL_INCLUDED_」 の意味がよくわからないです。 おそらく、 「REDEF1_H」はファイル名で、 「20070101_1138」はredef1.hの作成日時か更新日時で 「INCLUDED」は「インクルードされている」の意味だと思う のですが、 「JOIE93UL」が何を意味するのかがさっぱりです。 さほど重要なことではなさそうですが、なんだか気持ちが悪いので どなたか教えて頂ければ幸いです

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

識別子名は、実は「重複さえしなければ、何でもOK」なのです。 #define SUZUMIYA_HARUHI_DAISUKI でも #define HARUHI_KAWAIIYO_HARUHI でも、何でも構いません。 ですが「適当に決めると、別のファイルの定義と衝突する可能性がある」ので「ファイル名や作成日を入れるなど、適当に決めても、他と重複する確率がゼロに近くなる」ようにします。 ですので >「REDEF1_H」はファイル名で、 >「20070101_1138」はredef1.hの作成日時か更新日時で >「INCLUDED」は「インクルードされている」の意味だと思う の部分は「適当に決めても他と重複しないようにする為」に、こうなっているだけなのです。 つまり、この部分は「ある規則に従って付けたので、なんか意味ありげだけど、実は意味は無い」のです。 でも、これだけでは「同じファイル名で、同じ時刻に、別の人が、別のヘッダーファイルを作る可能性」がゼロじゃないです。 そこで「他と絶対に重複しないようにする決定打」として「書いた本人だけしか意味が判らない文字列」も追加したのでしょう。 それが >「JOIE93UL」が何を意味するのかがさっぱりです。 です。 「書いた本人だけしか意味が判らない文字列」ならば「他人が同じ文字列を使う事は無い」ので、結果的に「他と絶対に重複しない」でしょう。 そう言う訳で「JOIE93UL」の意味を知ってるのは書いた本人だけで、貴方やここの回答者は、その意味が判らなくて当然です。 そして「それが何を意味するのか知っても、何の影響もない」ので、貴方がそれを知る必要はありません。 貴方が「SUZUMIYA_HARUHI_DAISUKI」の意味が判らなくたって、ちゃんとコンパイルできれば何の問題もありませんよね?つまり、そういうことです。

apraxas
質問者

お礼

ご回答ありがとうございます。 よりわかりやすい説明をして頂けて モヤモヤしたものが解消されました。

その他の回答 (2)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.3

> __ファイル名 みたいな感じにしますが C言語ではアンダーバーで始まる識別子は、 規格や処理系が使用する、「予約済み識別子」に 指定されているので、これを使用した識別子は 規格上その動作が未定義になります。 #現存する殆どの処理系では問題ないでしょうが、 #わざわざつける物でもないと思います。 > 「JOIE93UL」が何を意味するのかがさっぱりです。 書いた人に聞いてください。 No2の人が書いているように、 重複していなければなんでも良いので、 何を意図して書いたかは、書いた人にしかわからないです。

apraxas
質問者

お礼

ご回答ありがとうございます。 低次元の質問にもかかわらず 丁寧にお答え頂いて感謝感激です。

  • pick52
  • ベストアンサー率35% (166/466)
回答No.1

これは単なる例であり、同一プロジェクト内で重複しないなら何でも かまいません。 通常は、 __ファイル名 みたいな感じにしますが特に決まりがあるわけ ではありません。 ただし同じプロジェクト内では共通のルールで指定した方がいいでしょう。 #ifndef は指定された名前のマクロ(#define で登録した別名)が なければ #endif までを実行するプリプロセッサ(ディレクティブ)です。

参考URL:
http://www11.plala.or.jp/studyhall/cpp/include.html
apraxas
質問者

お礼

ご回答ありがとうございます。 何らかの書式に対応した書き方だと思っていたのが 誤りだったわけですね。

関連するQ&A