- ベストアンサー
ヘッダファイルとソースファイルの関係について
- ヘッダファイルとソースファイルとは、C++プログラムの構成要素であり、互いに関連しています。ヘッダファイルは、関数や変数の宣言を含み、ソースファイルは実際の処理を定義します。
- ヘッダファイルは、他のファイルからインクルードされることで、その宣言が使用されます。また、ソースファイルに含まれる関数や変数を他のソースファイルから利用する場合も、ヘッダファイルを使用します。
- ヘッダファイルとソースファイルは、一体となってプログラムを構成するため、ヘッダファイルをインクルードすると、関連するソースファイルも同時に読み込まれます。この仕組みにより、関数や変数の宣言と定義を分離し、ソースコードの見通しを良くすることができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> main.cppを起動した時に、kansuuのヘッダファイルしか呼んでいないのに、kansuu.cppの処理内容「あいうえお」がしっかりと表示されてしまうのはなぜなんでしょうか? 結論から言うと、実行ファイルの中にkansuu.cppをコンパイルしたものも入っているからです。 printf()の話と同じことなのですが、kansuu.cpp, main.cppをコンパイルすると、それぞれに対応したオブジェクトファイルというものが作られ、さらにそれらのオブジェクトファイル全部と標準ライブラリなどを全てくっつけて(リンクして)、最終的な実行ファイルが作られます。 逆に言うと、オブジェクトファイルをくっつけてないとソース内でヘッダをincludeしていても「関数がありません」のようなコンパイルエラーになります。 この、どのオブジェクトファイルをリンクするか、というのは実行ファイルを作る最終段階のコンパイラ実行(実際にはリンカというプログラムの実行)のときに指定します。 もしかしたら指定している意識がないのかもしれませんが、どこかで指定しているはずです。 統合開発環境ならソース追加で自動的に設定してくれることがあります。
その他の回答 (2)
- jacta
- ベストアンサー率26% (845/3158)
#1さんと同じで、期待している答えが何かが分かりづらいのですが... ヘッダファイルをインクルードした場合、読み込まれるのはあくまでもそのヘッダファイルだけです。ただし、読み込んだヘッダファイルの中に#includeがあれば、それらも読み込むことになります。 もし、printf等がヘッダ(この場合は「ヘッダファイル」ではなく「ヘッダ」)をインクルードするだけでなぜ使えるかということであれば、実際にはヘッダをインクルードする必要さえないのです。 namespace std { int printf(const char* ...); } としてやれば、規格に合致した処理系であればstd::printfが使えます(多くの処理系は規格に完全に合致していませんが、処理系不明なので正確なアドバイスはできません)。 あとはコンパイル時の設定(オプションなど)しだいですが、これも処理系不明なので正確なことはいえません。普通は、標準関数は何も指定しなくても勝手にリンクされます。 ところで、 > Webプログラムとの違いに悩んでいる部分があります。 とのことですが、C++でもWebプログラミングは可能です。 これまで使っていた言語を補足していただけると、もう少し的確な回答ができるかと思います。それから処理系も。
お礼
#1さんと同様に早速のご回答ありがとうございます。 質問内容の分かりづらさについてはすいませんでした。 #1さんのお礼に、もう少しわかりやすいように、 再度ご質問をさせて頂きましたので、 そちらを見て頂けますでしょうか? >これまで使っていた言語を補足していただけると、もう少し的確な回答ができるかと思います。それから処理系も。 Webプログラムは、PHPとSmartyを使って行っておりました。 今回のような状況ですと、 PHP+Smartyの場合は。 main.php --------------------------------------- <? $smarty->display("main.tpl"); ?> --------------------------------------- main.tpl --------------------------------------- <form action="main.php"> <input type="submit" value="移動"> </form> --------------------------------------- 上記のような感じで、次の処理を呼び出す場合は、 どこを呼び出すかがソース上に書いてあるため、わかりやすいのですが・・・
- tokichim
- ベストアンサー率42% (88/205)
えーと例えば、stdio.hをincludeしたら、なぜソースにないprintf()が使えるのかわからない、ということでしょうか。 コンパイラで何のオプション指定もしないで単に実行ファイルを作るだけ、という場合、コンパイラが自動的に標準ライブラリというものをくっつけて(リンクといいます)くれるからです。 この場合、printf()の記述されているソースファイルが読み込まれているわけではありません。標準ライブラリの中にすでにコンパイル済みのprintf()が入っています。 もしも標準ライブラリにない関数を使う場合にはコンパイラのオプションでこれこれのライブラリをリンクする、と教えてやらなければなりません。 所望の答えでしょうか?
お礼
早速のご回答ありがとうございます。 質問内容がわかりずらかったようで、 すいませんでした。 例として、 kansuu.h -------------------------------------------- void kansuu1( void ); // 関数の宣言のみ行う -------------------------------------------- kansuu.cpp -------------------------------------------- void kansuu1() { printf("あいうえお"); } -------------------------------------------- main.cpp -------------------------------------------- #include "kansuu.h" kansuu1(); -------------------------------------------- (stdio.hなどの処理に必要なインクルードは省略) 上記のような感じで、 main.cppを起動した時に、kansuuのヘッダファイルしか呼んでいないのに、kansuu.cppの処理内容「あいうえお」がしっかりと表示されてしまうのはなぜなんでしょうか?
お礼
ご回答ありがとうございます。 なるほど!今までは、すでに整っている制作環境でプログラムを行っていたために、指定しているという意識がなかっただけで、 実際は、PHPでSmartyのパスを指定するように、リンクするパスを指定している場所があるんですね。 納得致しました。 どうもありがとうございました!