• ベストアンサー

インクルードガードの命名の仕方

質問です。 インクルードガードの際、インクルードガード名は自由に設定できるのでしょうか。 例えばheader.h内で以下のように設定します。 #ifndef COMMON_HEADER_H #define COMMON_HEADER_H このとき、COMMON_HEADER_Hはheader.hを指しますか。

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

  • ベストアンサー
回答No.3

これは単なる(#define で指定する)マクロ名なので、ファイル名とは本来何の関係もありません。 ただ、ほかのファイルで指定したものと重なると都合が悪いので、ファイル名と同じにすると、そのあたりの回避にはつながるでしょう。 プロジェクトの中で命名規則があれば、それに従えばいいかなというくらいで、わかりやすくてなおかつ、ほかのファイルと重ならなければ、いいわけです。

noname#57283
質問者

お礼

わかりやすいご回答ありがとうございました。今後の参考にさせていただきます。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

普通はファイル名から一意に決まる名前を付けます(既出の回答の通り)。 一点注意しなければならないのは、予約済み識別子を使用しないようにすることです。 具体的には、標準ライブラリの関数やマクロ等と同じ名前を使わないこと。そして、下線で始まり、下線または大文字が続く名前を使わないことです。 #ifndef _COMMON_HEADER_H_ #define _COMMON_HEADER_H_ といった命名は、よくやってしまいがちな失敗です(下線で始まり、大文字が続く識別子なので)。 このような予約済み識別子を使った場合の動作は未定義です。 ただし例外もあります。 質問者さんが、もし標準ライブラリを実装しているのであれば、逆に予約済み識別子以外を使ってはいけません。例えば、stdio.hの実装では、 #ifndef _STDIO_H #define _STDIO_H とすることは可能ですが、 #ifndef STDIO_H #define STDIO_H としてしまうと、アプリケーションで(自由に使ってよいはずの)STDIO_Hという識別子が使えなくなってしまいます。

noname#57283
質問者

お礼

回答ありがとうございました。参考にさせていただきます。

回答No.4

蛇足ですが、VCなら #pragma once が使えるので、悩まなくてもいいんですがねぇ。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★これ質問? >インクルードガードの際、インクルードガード名は自由に設定できるのでしょうか。  ↑  自由です。分かりやすくどうぞ。 >このとき、COMMON_HEADER_Hはheader.hを指しますか。  ↑  これ。たずねられても困りますが『COMMON』となっているので全ソースに共通で  インクルードするヘッダに分かりやすくつけているのでは?と思います。 ・以前、私は #ifndef の記号定数にヘッダファイル名と同じ名前で大文字にした両端に『_』文字を  追加していました。そして『.h』を『HEAD』にして多重インクルード防止のルールを設けていました。  例 stdio.h→_STDIO_HEAD_  例 stdlib.h→_STDLIB_HEAD_  例 string.h→_STRING_HEAD_ ・今は少し変えて『.h』を『INCLUDE』にしています。  例 stdio.h→_STDIO_INCLUDE_  例 stdlib.h→_STDLIB_INCLUDE_  例 string.h→_STRING_INCLUDE_  です。 ・最終的に命名規則は自由です。

noname#57283
質問者

お礼

回答ありがとうございました。参考にさせていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

インクルードガード用に使うマクロの名前は (当然) なんでもいいんだけど, ファイル名と関連させないと謎にしかならない. 「COMMON_HEADER_H が header.h を指す」というのは「書いた人がそう決めたから」以外の何物でもありません.

noname#57283
質問者

お礼

自由に命名できるんですね。ありがとうございました。

関連するQ&A