dポイントプレゼントキャンペーン実施中!

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

#ifndef COMMON_HEADER_H
#define COMMON_HEADER_H

このとき、COMMON_HEADER_Hはheader.hを指しますか。

A 回答 (5件)

これは単なる(#define で指定する)マクロ名なので、ファイル名とは本来何の関係もありません。


ただ、ほかのファイルで指定したものと重なると都合が悪いので、ファイル名と同じにすると、そのあたりの回避にはつながるでしょう。

プロジェクトの中で命名規則があれば、それに従えばいいかなというくらいで、わかりやすくてなおかつ、ほかのファイルと重ならなければ、いいわけです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/08 23:19

普通はファイル名から一意に決まる名前を付けます(既出の回答の通り)。


一点注意しなければならないのは、予約済み識別子を使用しないようにすることです。
具体的には、標準ライブラリの関数やマクロ等と同じ名前を使わないこと。そして、下線で始まり、下線または大文字が続く名前を使わないことです。

#ifndef _COMMON_HEADER_H_
#define _COMMON_HEADER_H_

といった命名は、よくやってしまいがちな失敗です(下線で始まり、大文字が続く識別子なので)。
このような予約済み識別子を使った場合の動作は未定義です。

ただし例外もあります。
質問者さんが、もし標準ライブラリを実装しているのであれば、逆に予約済み識別子以外を使ってはいけません。例えば、stdio.hの実装では、

#ifndef _STDIO_H
#define _STDIO_H

とすることは可能ですが、

#ifndef STDIO_H
#define STDIO_H

としてしまうと、アプリケーションで(自由に使ってよいはずの)STDIO_Hという識別子が使えなくなってしまいます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/08 23:16

蛇足ですが、VCなら


#pragma once
が使えるので、悩まなくてもいいんですがねぇ。
    • good
    • 0

★これ質問?


>インクルードガードの際、インクルードガード名は自由に設定できるのでしょうか。
 ↑
 自由です。分かりやすくどうぞ。
>このとき、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_
 です。
・最終的に命名規則は自由です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/08 23:15

インクルードガード用に使うマクロの名前は (当然) なんでもいいんだけど, ファイル名と関連させないと謎にしかならない.


「COMMON_HEADER_H が header.h を指す」というのは「書いた人がそう決めたから」以外の何物でもありません.
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/08 23:13

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