プロが教える店舗&オフィスのセキュリティ対策術

http://www.geocities.co.jp/SiliconValley/6071/te …
に書いてあることで質問です。

/* myheader.h */
#ifndef __myheader_H__
#define __myheader_H__
:
:
:
#endif

と記述されているのですが、ここの「#define __myheader_H__ 」というのは、myheader.hをインクルードしているという意味になるのでしょうか?

あと、ifndef等でヘッダファイルが読み込まれているか判定する際には、コンマをアンダーバー(アンダースコア)に変えるという作業は必ずいるようですが、いろんな所を調べてみると、例えば、myheader.hについて判定する場合は、

__myheader_H__
myheader_H
_myheader_H
_MYHEADER_H

等、アンダースコアが先頭と最後に2個付いていたり、先頭に1個だけだったり、全部大文字にしていたりと、様々なものがあるのですが、これはどの様な表記を使えばいいのでしょうか?

A 回答 (3件)

ありません。

define は文字通り「定義する」だけです。
ifndef は if not defined の略で「定義されていなければ」ということです。
endif は ifndef の対で、「ここまで」を指定しているとみなせます。

define には色々な応用の仕方があって、インクルードガードは
そのうちの一つです。

「プリプロセッサ」から調べられた方が結果的に理解が早いかと思います。
以下のページの20章や52章、60章をどうぞ。

参考URL:http://www.geocities.jp/ky_webid/c/index.html
    • good
    • 0
この回答へのお礼

#defineって普段

#define 定数 置換する数字

って感じで使ってたんですけど、ソースの中に指定した定数が無くても、置換するものを書かなくっても使えるもので、普段「定数」で指定しているものを定義したかどうかってことを判断しているifdefで、2重にインクルードしないように判別する意味だけでdefineしていたということですか・・・

どうも有り難うございました。

お礼日時:2008/07/14 03:53

インクルードガードという手法で、#define から #endif までの区間を


多重インクルードされないようにするための処置です。一回されれば充分なので。
これ自体がインクルードしようとしているわけではありません。

例えば myheader.h をインクルードしている test.h と sample.h があったとします。
そこで main.c で test.h と sample.h をインクルードすると、
間接的に myheader.h は二回読み込まれてしまうことになり、その内容が
二回宣言されてしまいます。これだと大抵コンパイルは通りません。

インクルードガードしておけば、上記のような場合でも二回目以降の内容が
読み込まれないので、問題が生じません。

なお、先頭に #pragma once と記述するのも等価です(主に Visual C++)。

表記に関しては、他の部分と重ならなければ問題ありません。
ただし慣習的なものは存在していますので、
例えば以下のサイトが参考になるかと思います。

参考URL:http://www.henshi.net/k/hiki.cgi?GoogleCppStyleG …
    • good
    • 0
この回答へのお礼

解答有り難うございます

ってことは、defineって、定数を定義するのとマクロ関数として使う機能以外に、ヘッダファイルをincludeする機能もあるってことですか?

お礼日時:2008/07/14 00:52

結果的には「myheader.hをインクルードしている」という意味になりますが、実際の動作は「_myheader_H_」を定義しているだけです。


「_myheader_H_」が定義されていないときだけ、#ifndef以下が実行されますから、一度目の読み込みで「_myheader_H_」を定義してしまいます。そうすると二度目にヘッダファイルを読み込んだときに再定義されなくなり、エラーが起きません。色々なところで呼び出している可能性があるヘッダファイルの場合、こうしてエラーを回避します。

後段の質問ですが、判定するのはあくまでも自分自身が定義しているものを使います。(他で定義されているものを使用すると、読み込み順序によって読み込まれない可能性も出てきますからね。)様々な定義方法が書かれているようですが、それぞれの部分を読み込む・読み込まないの判定に使用するだけですので、他と重ならないように表記すればOKです。
    • good
    • 0
この回答へのお礼

解答有り難うございます

ってことは、defineって、定数を定義するのとマクロ関数として使う機能以外に、ヘッダファイルをincludeする機能もあるってことですか?

お礼日時:2008/07/14 00:52

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