- ベストアンサー
インクルードガードの命名の仕方
質問です。 インクルードガードの際、インクルードガード名は自由に設定できるのでしょうか。 例えばheader.h内で以下のように設定します。 #ifndef COMMON_HEADER_H #define COMMON_HEADER_H このとき、COMMON_HEADER_Hはheader.hを指しますか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
これは単なる(#define で指定する)マクロ名なので、ファイル名とは本来何の関係もありません。 ただ、ほかのファイルで指定したものと重なると都合が悪いので、ファイル名と同じにすると、そのあたりの回避にはつながるでしょう。 プロジェクトの中で命名規則があれば、それに従えばいいかなというくらいで、わかりやすくてなおかつ、ほかのファイルと重ならなければ、いいわけです。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
普通はファイル名から一意に決まる名前を付けます(既出の回答の通り)。 一点注意しなければならないのは、予約済み識別子を使用しないようにすることです。 具体的には、標準ライブラリの関数やマクロ等と同じ名前を使わないこと。そして、下線で始まり、下線または大文字が続く名前を使わないことです。 #ifndef _COMMON_HEADER_H_ #define _COMMON_HEADER_H_ といった命名は、よくやってしまいがちな失敗です(下線で始まり、大文字が続く識別子なので)。 このような予約済み識別子を使った場合の動作は未定義です。 ただし例外もあります。 質問者さんが、もし標準ライブラリを実装しているのであれば、逆に予約済み識別子以外を使ってはいけません。例えば、stdio.hの実装では、 #ifndef _STDIO_H #define _STDIO_H とすることは可能ですが、 #ifndef STDIO_H #define STDIO_H としてしまうと、アプリケーションで(自由に使ってよいはずの)STDIO_Hという識別子が使えなくなってしまいます。
お礼
回答ありがとうございました。参考にさせていただきます。
- Situgyosya
- ベストアンサー率41% (21/51)
蛇足ですが、VCなら #pragma once が使えるので、悩まなくてもいいんですがねぇ。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★これ質問? >インクルードガードの際、インクルードガード名は自由に設定できるのでしょうか。 ↑ 自由です。分かりやすくどうぞ。 >このとき、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_ です。 ・最終的に命名規則は自由です。
お礼
回答ありがとうございました。参考にさせていただきます。
- Tacosan
- ベストアンサー率23% (3656/15482)
インクルードガード用に使うマクロの名前は (当然) なんでもいいんだけど, ファイル名と関連させないと謎にしかならない. 「COMMON_HEADER_H が header.h を指す」というのは「書いた人がそう決めたから」以外の何物でもありません.
お礼
自由に命名できるんですね。ありがとうございました。
お礼
わかりやすいご回答ありがとうございました。今後の参考にさせていただきます。