- ベストアンサー
2重の(?)の#include
プログラム例を見ていたら ----- main.c ----- #include aaa.h (1) ----- aaa.h ----- #include aaa.h (2) とありました。 (1)はわかるのですが、 aaa.hで、また(2)、自分自身を#includeするのはなぜか 教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です どちらもダブルクォートですか。#2様の仰ることが正解なら話ここまでですが、私の経験上では、自身を再帰的にインクルードするような場合は記憶にないのでチョット気になります。 コンパイルスイッチで何かしらの処理を行うにしても、自身を再帰的に呼び出してってのは意味があるようには思えません。 単にトリッキーなことがしたいだけとかなら分かるのですが... 確認ですが、aaa.h自体はひとつしか存在しないのですか?別のパスにaaa.hが存在してたりしませんか? > aaa.hで、また(2)、自分自身を#includeするのはなぜか とあるのですが、実はMakefileの設定等で別のaaa.hをインクルードしてるってことはないですか?
その他の回答 (3)
- akr
- ベストアンサー率18% (32/173)
#3です > #include aaa.h (2) > を削除しても動作に変化はありませんでした。 この情報は役に立たないです。 動作に影響ないのは、ファイル内に書かれたコードは使用されていないってだけの話ですよね。 今回の質問は、自分自身をインクルードするのはなぜかってことでしたよね。 ちなみに、#3で書いた「確認ですが~」に対しての回答は頂けませんか? 一応、試験的に再帰的にインクルードするコードを書いてビルドしたところ下記のエラーが出ました。 <ここから> In file included from aaa.h:1, from aaa.h:1, from aaa.h:1, from aaa.h:1, from aaa.h:1, : 省略 from aaa.h:1, from aaa.h:1, from aaa.h:1, from aaa.h:1, from aaa.h:1, from main.c:1: aaa.h:1:17: error: #include nested too deeply <ここまで>
お礼
回答ありがとうございます。 話が私のレベルを越えた内容になってきました。 人のサンプルがどうあれ、自分で書くプログラムは 自分のレベルで自分にわかりやすく書きたいと思います。
- TT414
- ベストアンサー率18% (72/384)
インクルードファイルの再帰呼び出しはたまにあります。 無限回の再帰飛び出しを防ぐために >#include aaa.h (2) の前後に #if ... #endif があるはずです。 ----- main.c ----- #include "aaa.h" ----- aaa.h ----- #ifndef AAA #define AAA 111 #include "aaa.h" #undef AAA #define AAA 222 #include "aaa.h" #undef AAA #else ; ; ; #endif
お礼
回答ありがとうございます。 >#include aaa.h (2) >の前後に >#if ... >#endif >があるはずです。 ありませんでした。 また、 #include aaa.h (2) をコメントアウトしても動作に変化ありませんでした。
- akr
- ベストアンサー率18% (32/173)
コーディングミスではないんですよね。 その前に、インクルードのところはどちらも同じ表記でしたか? 「#include <aaa.h>」と「#include "aaa.h"」は、異なるファイルを指す事ができます。
お礼
回答ありがとうございます。 >コーディングミスではないんですよね。 市販キットのサンプルプログラムなのでプロが書いたものと思うんですが。 >異なるファイルを指す事ができます。 どちらも"aaa.h"です。
お礼
回答ありがとうございます。 #include aaa.h (2) を削除しても動作に変化はありませんでした。