
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個だけだったり、全部大文字にしていたりと、様々なものがあるのですが、これはどの様な表記を使えばいいのでしょうか?
No.3ベストアンサー
- 回答日時:
ありません。
define は文字通り「定義する」だけです。ifndef は if not defined の略で「定義されていなければ」ということです。
endif は ifndef の対で、「ここまで」を指定しているとみなせます。
define には色々な応用の仕方があって、インクルードガードは
そのうちの一つです。
「プリプロセッサ」から調べられた方が結果的に理解が早いかと思います。
以下のページの20章や52章、60章をどうぞ。
参考URL:http://www.geocities.jp/ky_webid/c/index.html
#defineって普段
#define 定数 置換する数字
って感じで使ってたんですけど、ソースの中に指定した定数が無くても、置換するものを書かなくっても使えるもので、普段「定数」で指定しているものを定義したかどうかってことを判断しているifdefで、2重にインクルードしないように判別する意味だけでdefineしていたということですか・・・
どうも有り難うございました。
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?GoogleCppStyleG …
解答有り難うございます
ってことは、defineって、定数を定義するのとマクロ関数として使う機能以外に、ヘッダファイルをincludeする機能もあるってことですか?

No.1
- 回答日時:
結果的には「myheader.hをインクルードしている」という意味になりますが、実際の動作は「_myheader_H_」を定義しているだけです。
「_myheader_H_」が定義されていないときだけ、#ifndef以下が実行されますから、一度目の読み込みで「_myheader_H_」を定義してしまいます。そうすると二度目にヘッダファイルを読み込んだときに再定義されなくなり、エラーが起きません。色々なところで呼び出している可能性があるヘッダファイルの場合、こうしてエラーを回避します。
後段の質問ですが、判定するのはあくまでも自分自身が定義しているものを使います。(他で定義されているものを使用すると、読み込み順序によって読み込まれない可能性も出てきますからね。)様々な定義方法が書かれているようですが、それぞれの部分を読み込む・読み込まないの判定に使用するだけですので、他と重ならないように表記すればOKです。
解答有り難うございます
ってことは、defineって、定数を定義するのとマクロ関数として使う機能以外に、ヘッダファイルをincludeする機能もあるってことですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Arduino UNO のC言語 2 2023/04/18 19:42
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- 英語 口頭での"the following..."の可否等について 6 2022/08/19 01:01
- Java Java 南京錠 2 2023/02/04 11:46
- Windows 10 renameコマンドでファイル名からアンダースコアを消す方法 5 2023/04/24 13:33
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- その他(プログラミング・Web制作) COBOL数値転記をCOPY句内での仕様 6 2022/06/15 18:48
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
End Sub が必要です。
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
ユニティ(unity)です。プログ...
-
#ifndefとかヘッダファイルにつ...
-
select関数の使用方法について
-
Mac OSX上でFortranを使いたい
-
DLL内からの外部変数の参照
-
typedef による2重定義
-
フォートラン(fortran)のエラー...
-
配列数式の解除
-
教えて下さい
-
特定のPCだけ動作しないVBAマク...
-
Excel・Word リサーチ機能を無...
-
一つのTeratermのマクロで複数...
-
エクセルで特定の列が0表示の場...
-
エクセルに張り付けた写真のフ...
-
【VBA】ワークブックを開く時に...
-
メッセージボックスのOKボタ...
-
UserForm1.Showでエラーになり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
End Sub が必要です。
-
Excel VABについて 下記記述が...
-
フォートランのエラーについて...
-
43:syntax error at end of input
-
他クラスからForm1内コントロル...
-
intel fortranのエラーで困って...
-
ラズパイ上の、pythonのエラー...
-
C# IEnumerable が IEnumerable...
-
VBでエラー'ActiveX component ...
-
AccessVBAでVLookupを使いたい
-
フォートラン(fortran)のエラー...
-
DLL内からの外部変数の参照
-
Excel VBA: UserForm.Show で実...
-
値を返さないといけないのに、...
-
解説サイトに従ったfortran並列...
-
対応する関数ヘッダーがありません
-
【ルネサスのマイコン】E8aから...
-
C2065: 'EnumDisplayDevices' :...
-
typedef による2重定義
-
HEW3とBorlandC++でクラス定義...
おすすめ情報