アプリ版:「スタンプのみでお礼する」機能のリリースについて

「ローベルの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」が何を意味するのかがさっぱりです。
さほど重要なことではなさそうですが、なんだか気持ちが悪いので
どなたか教えて頂ければ幸いです

A 回答 (3件)

識別子名は、実は「重複さえしなければ、何でもOK」なのです。


#define SUZUMIYA_HARUHI_DAISUKI
でも
#define HARUHI_KAWAIIYO_HARUHI
でも、何でも構いません。

ですが「適当に決めると、別のファイルの定義と衝突する可能性がある」ので「ファイル名や作成日を入れるなど、適当に決めても、他と重複する確率がゼロに近くなる」ようにします。

ですので
>「REDEF1_H」はファイル名で、
>「20070101_1138」はredef1.hの作成日時か更新日時で
>「INCLUDED」は「インクルードされている」の意味だと思う
の部分は「適当に決めても他と重複しないようにする為」に、こうなっているだけなのです。

つまり、この部分は「ある規則に従って付けたので、なんか意味ありげだけど、実は意味は無い」のです。

でも、これだけでは「同じファイル名で、同じ時刻に、別の人が、別のヘッダーファイルを作る可能性」がゼロじゃないです。

そこで「他と絶対に重複しないようにする決定打」として「書いた本人だけしか意味が判らない文字列」も追加したのでしょう。

それが
>「JOIE93UL」が何を意味するのかがさっぱりです。
です。

「書いた本人だけしか意味が判らない文字列」ならば「他人が同じ文字列を使う事は無い」ので、結果的に「他と絶対に重複しない」でしょう。

そう言う訳で「JOIE93UL」の意味を知ってるのは書いた本人だけで、貴方やここの回答者は、その意味が判らなくて当然です。

そして「それが何を意味するのか知っても、何の影響もない」ので、貴方がそれを知る必要はありません。

貴方が「SUZUMIYA_HARUHI_DAISUKI」の意味が判らなくたって、ちゃんとコンパイルできれば何の問題もありませんよね?つまり、そういうことです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/08 20:35

> __ファイル名 みたいな感じにしますが


C言語ではアンダーバーで始まる識別子は、
規格や処理系が使用する、「予約済み識別子」に
指定されているので、これを使用した識別子は
規格上その動作が未定義になります。
#現存する殆どの処理系では問題ないでしょうが、
#わざわざつける物でもないと思います。

> 「JOIE93UL」が何を意味するのかがさっぱりです。
書いた人に聞いてください。
No2の人が書いているように、
重複していなければなんでも良いので、
何を意図して書いたかは、書いた人にしかわからないです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/08 20:38

これは単なる例であり、同一プロジェクト内で重複しないなら何でも


かまいません。

通常は、 __ファイル名 みたいな感じにしますが特に決まりがあるわけ
ではありません。
ただし同じプロジェクト内では共通のルールで指定した方がいいでしょう。

#ifndef は指定された名前のマクロ(#define で登録した別名)が
なければ #endif までを実行するプリプロセッサ(ディレクティブ)です。

参考URL:http://www11.plala.or.jp/studyhall/cpp/include.h …
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/08 20:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!