• ベストアンサー

#ifndefとかヘッダファイルについて

http://www.geocities.co.jp/SiliconValley/6071/technic/16.html に書いてあることで質問です。 /* 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個だけだったり、全部大文字にしていたりと、様々なものがあるのですが、これはどの様な表記を使えばいいのでしょうか?

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

  • ベストアンサー
  • norachlo
  • ベストアンサー率100% (10/10)
回答No.3

ありません。define は文字通り「定義する」だけです。 ifndef は if not defined の略で「定義されていなければ」ということです。 endif は ifndef の対で、「ここまで」を指定しているとみなせます。 define には色々な応用の仕方があって、インクルードガードは そのうちの一つです。 「プリプロセッサ」から調べられた方が結果的に理解が早いかと思います。 以下のページの20章や52章、60章をどうぞ。

参考URL:
http://www.geocities.jp/ky_webid/c/index.html
glarelance
質問者

お礼

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

その他の回答 (2)

  • norachlo
  • ベストアンサー率100% (10/10)
回答No.2

インクルードガードという手法で、#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?GoogleCppStyleGuide#l5
glarelance
質問者

お礼

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

noname#77845
noname#77845
回答No.1

結果的には「myheader.hをインクルードしている」という意味になりますが、実際の動作は「_myheader_H_」を定義しているだけです。 「_myheader_H_」が定義されていないときだけ、#ifndef以下が実行されますから、一度目の読み込みで「_myheader_H_」を定義してしまいます。そうすると二度目にヘッダファイルを読み込んだときに再定義されなくなり、エラーが起きません。色々なところで呼び出している可能性があるヘッダファイルの場合、こうしてエラーを回避します。 後段の質問ですが、判定するのはあくまでも自分自身が定義しているものを使います。(他で定義されているものを使用すると、読み込み順序によって読み込まれない可能性も出てきますからね。)様々な定義方法が書かれているようですが、それぞれの部分を読み込む・読み込まないの判定に使用するだけですので、他と重ならないように表記すればOKです。

glarelance
質問者

お礼

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

関連するQ&A