はじめまして。
現在、gcc version 4.3.3の環境でC++のプログラミングをしようとしています。
ソースコードは添付しました。
ターミナルから
make dep
make
と実行すると
A.cpp:6: error: ‘A’ has not been declared
.
.
.
と、ヘッダーの参照ができていないようです。
恐らくMakefileの書き方がおかしいのだと思いますが、
どこをどのように変更すべきなのでしょうか?
ちなみに、Makefileは以下のページのものをそのまま引用させていただきました。
Makefile覚書
ttp://apollon.cc.u-tokyo.ac.jp/~watanabe/tips/makefile.html
不備がありましたら、追記させていただきます。
g++ Makefileについて
Re:g++ Makefileについて
明らかにおかしかったですね。
#if !HEADER_NAME_Hで無事通りました。
初歩的な質問で申し訳ありませんでした。
ご回答有難うございました。
#if !HEADER_NAME_Hで無事通りました。
初歩的な質問で申し訳ありませんでした。
ご回答有難うございました。
Re:g++ Makefileについて
>#if !HEADER_NAME_Hで無事通りました
一見通ったかのように見えますが、それではダメだと思います。
試しに main.cppで A.hを2回インクルードしてみてください。
一見通ったかのように見えますが、それではダメだと思います。
試しに main.cppで A.hを2回インクルードしてみてください。
Re:g++ Makefileについて
> 試しに main.cppで A.hを2回インクルードしてみてください。
operator '!' has no right operand
とエラーが出ます。
次に
#ifndef HEADER_NAME_H
では無事にコンパイルが通りました。
なぜこうなるのかがイマイチ理解できないのですが・・・?
operator '!' has no right operand
とエラーが出ます。
次に
#ifndef HEADER_NAME_H
では無事にコンパイルが通りました。
なぜこうなるのかがイマイチ理解できないのですが・・・?
Re:g++ Makefileについて
最初に投稿されたものは
[color=#d0d0ff" face="monospace]
#ifdef INCLUDE_A_H
#define INCLUDE_A_H
#endif
[/color]
でした。
これは #ifdefが使われているので INCLUDE_A_Hが定義されているときのみ
#endifまでが有効になります。
従って定義されていれば2行目の #defineによって INCLUDE_A_Hが定義されるということになり、
定義されていなければ #defineによる INCLUDE_A_H定義が行われない、という大きな矛盾を
抱えたものでした。
次に
[color=#d0d0ff" face="monospace]
#if !HEADER_NAME_H
#define INCLUDE_A_H
#endif
[/color]
とすると、最初の段階で HEADER_NAME_Hが未定義であれば、INCLUDE_A_Hは 0に置き換えられます。
その為 #if !0となり、結果は真なので2行目の #defineによって HEADER_NAME_Hが「空」として
定義されます。
ここまではいいのですが、これを2回目以降評価する時には #ifの行で INCLUDE_A_Hが
先の #defineによって既に定義されているので「空」に置き換えられます
するとこの行は #if ! となり、 !を単独でつけても評価できずエラーになります。
で、最後に
[color=#d0d0ff" face="monospace]
#ifndef INCLUDE_A_H
#define INCLUDE_A_H
#endif
[/color]
もしくは
[color=#d0d0ff" face="monospace]
#if !defined(INCLUDE_A_H)
#define INCLUDE_A_H
#endif
[/color]
とすれば INCLUDE_A_Hが未定義の時のみ #endifまでが有効となるので、INCLUDE_A_Hの定義が
なければ #defineで INCLUDE_A_Hを定義するとなります。
2回目以降の評価の時は当然 INCLUDE_A_Hが定義済みであり #ifの条件を満たさないので
以降は無視されます。
これで正しくインクルードガードとして機能する、というわけです。
[color=#d0d0ff" face="monospace]
#ifdef INCLUDE_A_H
#define INCLUDE_A_H
#endif
[/color]
でした。
これは #ifdefが使われているので INCLUDE_A_Hが定義されているときのみ
#endifまでが有効になります。
従って定義されていれば2行目の #defineによって INCLUDE_A_Hが定義されるということになり、
定義されていなければ #defineによる INCLUDE_A_H定義が行われない、という大きな矛盾を
抱えたものでした。
次に
[color=#d0d0ff" face="monospace]
#if !HEADER_NAME_H
#define INCLUDE_A_H
#endif
[/color]
とすると、最初の段階で HEADER_NAME_Hが未定義であれば、INCLUDE_A_Hは 0に置き換えられます。
その為 #if !0となり、結果は真なので2行目の #defineによって HEADER_NAME_Hが「空」として
定義されます。
ここまではいいのですが、これを2回目以降評価する時には #ifの行で INCLUDE_A_Hが
先の #defineによって既に定義されているので「空」に置き換えられます
するとこの行は #if ! となり、 !を単独でつけても評価できずエラーになります。
で、最後に
[color=#d0d0ff" face="monospace]
#ifndef INCLUDE_A_H
#define INCLUDE_A_H
#endif
[/color]
もしくは
[color=#d0d0ff" face="monospace]
#if !defined(INCLUDE_A_H)
#define INCLUDE_A_H
#endif
[/color]
とすれば INCLUDE_A_Hが未定義の時のみ #endifまでが有効となるので、INCLUDE_A_Hの定義が
なければ #defineで INCLUDE_A_Hを定義するとなります。
2回目以降の評価の時は当然 INCLUDE_A_Hが定義済みであり #ifの条件を満たさないので
以降は無視されます。
これで正しくインクルードガードとして機能する、というわけです。