ヘッダファイルとソースファイルの関係について

このQ&Aのポイント
  • ヘッダファイルとソースファイルとは、C++プログラムの構成要素であり、互いに関連しています。ヘッダファイルは、関数や変数の宣言を含み、ソースファイルは実際の処理を定義します。
  • ヘッダファイルは、他のファイルからインクルードされることで、その宣言が使用されます。また、ソースファイルに含まれる関数や変数を他のソースファイルから利用する場合も、ヘッダファイルを使用します。
  • ヘッダファイルとソースファイルは、一体となってプログラムを構成するため、ヘッダファイルをインクルードすると、関連するソースファイルも同時に読み込まれます。この仕組みにより、関数や変数の宣言と定義を分離し、ソースコードの見通しを良くすることができます。
回答を見る
  • ベストアンサー

ヘッダファイルとソースファイルについて

今までは、Webプログラミングを行っていたのですが、 最近になって、C++の仕事を請け負いましたので、 C++を勉強しつつ、プログラムをしていたのですが、 Webプログラムとの違いに悩んでいる部分があります。 それは、ヘッダファイルとソースファイルの関係についてです。 ほかのファイルから、インクルードされたヘッダファイルが、 読み込まれるというのは納得がいくのですが、 そのヘッダファイルに関連付け(?)られたソースファイルも、 一緒に読み込まれるという理由がわかりません。 ヘッダファイルでソースファイルを読んでいるような記述もないような感じなので、とても疑問に思っております。 なぜ、ヘッダファイルをインクルードしただけで、付属のソースファイルも読み込まれるのでしょうか?

  • teala
  • お礼率100% (13/13)

質問者が選んだベストアンサー

  • ベストアンサー
  • tokichim
  • ベストアンサー率42% (88/205)
回答No.3

> main.cppを起動した時に、kansuuのヘッダファイルしか呼んでいないのに、kansuu.cppの処理内容「あいうえお」がしっかりと表示されてしまうのはなぜなんでしょうか? 結論から言うと、実行ファイルの中にkansuu.cppをコンパイルしたものも入っているからです。 printf()の話と同じことなのですが、kansuu.cpp, main.cppをコンパイルすると、それぞれに対応したオブジェクトファイルというものが作られ、さらにそれらのオブジェクトファイル全部と標準ライブラリなどを全てくっつけて(リンクして)、最終的な実行ファイルが作られます。 逆に言うと、オブジェクトファイルをくっつけてないとソース内でヘッダをincludeしていても「関数がありません」のようなコンパイルエラーになります。 この、どのオブジェクトファイルをリンクするか、というのは実行ファイルを作る最終段階のコンパイラ実行(実際にはリンカというプログラムの実行)のときに指定します。 もしかしたら指定している意識がないのかもしれませんが、どこかで指定しているはずです。 統合開発環境ならソース追加で自動的に設定してくれることがあります。

teala
質問者

お礼

ご回答ありがとうございます。 なるほど!今までは、すでに整っている制作環境でプログラムを行っていたために、指定しているという意識がなかっただけで、 実際は、PHPでSmartyのパスを指定するように、リンクするパスを指定している場所があるんですね。 納得致しました。 どうもありがとうございました!

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

#1さんと同じで、期待している答えが何かが分かりづらいのですが... ヘッダファイルをインクルードした場合、読み込まれるのはあくまでもそのヘッダファイルだけです。ただし、読み込んだヘッダファイルの中に#includeがあれば、それらも読み込むことになります。 もし、printf等がヘッダ(この場合は「ヘッダファイル」ではなく「ヘッダ」)をインクルードするだけでなぜ使えるかということであれば、実際にはヘッダをインクルードする必要さえないのです。 namespace std { int printf(const char* ...); } としてやれば、規格に合致した処理系であればstd::printfが使えます(多くの処理系は規格に完全に合致していませんが、処理系不明なので正確なアドバイスはできません)。 あとはコンパイル時の設定(オプションなど)しだいですが、これも処理系不明なので正確なことはいえません。普通は、標準関数は何も指定しなくても勝手にリンクされます。 ところで、 > Webプログラムとの違いに悩んでいる部分があります。 とのことですが、C++でもWebプログラミングは可能です。 これまで使っていた言語を補足していただけると、もう少し的確な回答ができるかと思います。それから処理系も。

teala
質問者

お礼

#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)
回答No.1

えーと例えば、stdio.hをincludeしたら、なぜソースにないprintf()が使えるのかわからない、ということでしょうか。 コンパイラで何のオプション指定もしないで単に実行ファイルを作るだけ、という場合、コンパイラが自動的に標準ライブラリというものをくっつけて(リンクといいます)くれるからです。 この場合、printf()の記述されているソースファイルが読み込まれているわけではありません。標準ライブラリの中にすでにコンパイル済みのprintf()が入っています。 もしも標準ライブラリにない関数を使う場合にはコンパイラのオプションでこれこれのライブラリをリンクする、と教えてやらなければなりません。 所望の答えでしょうか?

teala
質問者

お礼

早速のご回答ありがとうございます。 質問内容がわかりずらかったようで、 すいませんでした。 例として、 kansuu.h -------------------------------------------- void kansuu1( void ); // 関数の宣言のみ行う -------------------------------------------- kansuu.cpp -------------------------------------------- void kansuu1() { printf("あいうえお"); } -------------------------------------------- main.cpp -------------------------------------------- #include "kansuu.h" kansuu1(); -------------------------------------------- (stdio.hなどの処理に必要なインクルードは省略) 上記のような感じで、 main.cppを起動した時に、kansuuのヘッダファイルしか呼んでいないのに、kansuu.cppの処理内容「あいうえお」がしっかりと表示されてしまうのはなぜなんでしょうか?

関連するQ&A

  • ソースとヘッダの境界とは?

    C/C++のプログラミングにおいて、これだけは絶対にソースファイル(.c,.cpp)書かなくてはならない!というものはあるのでしょうか? 仕事でプログラミングをしている時に、同僚から「その変数の定義はソースファイルに書かないとダメ」と言われました。 「その変数の定義」とは、メモリの物理アドレスへの割り付けを伴うもので、以下のようなものです。 #pragma section=~, IO=~, attr=~, locate=0xFECA0000 __io int piyo; /* 0xFECA0000 */ __io int hoge; /* 0xFECA0004 */ 特殊なコードで分かりにくく、申し訳ないのですが、簡単に言えば、「locate」で指定した物理アドレスから連続で変数を割り当てていくものです。 このコードをなぜヘッダではなく、「絶対に」ソースファイルに書かなくてはならないのかを尋ねましたが、明確な回答は得られませんでした。 私の認識としては、ソースファイルにAという処理を書くことと、Aの処理を書いたヘッダファイルをincludeすることとは、コンパイラにとっては全く同じことだと思ってます。 試しに、以下のソースを書いた「ヘッダ」ファイル”test.h”と「#include "test.h"」とだけ書いたソースファイル”test.c”を作成してビルドしたら、ちゃんと動く実行ファイルができました。 #include <stdio.h> int main(void) { printf( "Hello, World!\n" ); return 0; } 今回ご回答頂きたいのは、上記の物理アドレス割り付けのコードについてではなく、一般的な話として、これは「絶対に」ソースファイルに書かなきゃいけない!それは「絶対に」ヘッダファイルに書かなきゃいけない!とか言うものがあるのかどうか。あるとすれば、具体的にどのようなものなのかと言うことです。 何卒よろしくお願いいたします。

  • ヘッダファイルに関数本体を書き込めないのか?

    こんにちは。 現在WindowsVistaでCおよびC++を使ってプログラミングを行っています。 最近になって思ったのですが、普通、ヘッダファイルに記述する内容は、 ・関数のプロトタイプ ・クラスのメンバ関数を除いた部分(いわゆる「クラスの骨格」) ・マクロ といったものだと言われています。 そして、関数の実態やクラスのメンバ関数などは、 別のソースファイルに記述するように言われています。 なぜ、ヘッダファイルに関数の実態や、クラスのメンバ関数を記述するべきではないでしょうか? あるいは、プログラムの内容に応じて、関数やクラスの内容を、 ヘッダファイルにまるごと記述してもよい場合と悪い場合があるのでしょうか? こういった事について、何か御存じの方がいらっしゃれば、是非アドバイスをお願い致します。 (難しい問題なので、なるべく詳しい説明を頂けると、大変助かります。) ちなみに、関数やクラスのメンバ関数も一緒に、クラスの内容をまるごとヘッダファイルに記述しても、 今までの所、全く問題なく動作しています。 例えば、以下のようなプログラムは、何の問題もなく動作します。 ●main.c ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "func.h" void main(void) { char str[80]; puts("文字列を入力せよ"); gets(str); func(str); } ____________________________________________________________ ●func.h ____________________________________________________________ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> void func(char *p) { puts("入力された内容は以下の通り。"); while(*p) putchar(*p++); } ____________________________________________________________

  • ヘッダファイルとソースファイルについて

    C++初心者なのですが ヘッダファイルとソースファイルの関係がよく分かりません。 ヘッダファイルとソースファイルはフリーソフトなどで、統合したりする事が出来るのでしょうか? よろしくお願いします!

  • 1 つのヘッダファイルに複数のクラスって?

    C++ でコンソールアプリケーションを作っています。 プログラムの規模が大きくなり,クラスの数も増えてきました。 これまでヘッダファイルとクラスを一対一対応させてきました。 クラスの増加に伴い,ヘッダファイルがかなり増えてしまいました。 疑問に思ったのですが 1 つのヘッダファイルに記述するクラスの個数に,決まりはあるのでしょうか? ためしに 1 つのヘッダファイルに 2 つのクラスを書くと,問題なく動作しました。 ちなみに,その 2 つのクラスの関係は,お互いに完全に独立し合っている関係です。 (継承や friend の利用など一切なし,ということです。) 1 つのヘッダファイルに複数のクラスを書くことは OK なのでしょうか? またこうすることで生じる問題があれば,お聞かせいただければ幸いです。 (プログラミング超初心者につきマヌケな質問をしているかもしれません)

  • 自作したヘッダファイルをインクルードするには

    自作したヘッダファイルをインクルードするには 自作したヘッダファイルを半角スペースを含むフォルダを指定する時、 何かエスケープシーケンス文字が必要でしたでしょうか?ド忘れしてしまいました… 例えば、Program Filesの直下に入れた自作ヘッダファイルa.h(まず考えられないとは思いますが…)を インクルードしたい時、 #include "C:\\Program Files\\a.h" でいいんですよね?

  • ヘッダファイルの有効範囲

    現在OpenGLを使ったプログラムを作っていて, hoge.hというヘッダファイルで #include <GL/glut.h> piyo.hというヘッダファイルには #include "hoge.h" そしてさらにhogehoge.hというヘッダファイルに #include "piyo.h" として, hogehoge.cppのソースファイルにて #include "hogehoge.h"してOpenGLの関数を使おうとしたら エラーが出ました. hogehoge.cppでhogehoge.hをインクルード →hogehoge.hでpiyo.hをインクルード →piyo.hでhoge.hをインクルード →hoge.hでGL/glut.hをインクルード というように,橋渡し的にインクルードはできないのでしょうか? これはこのような仕様なのでしょうか? それとも他に誤りがある可能性があるのでしょうか… 非常に困っております. ご回答お待ちしております.

  • #include <Windows.h>というヘッダファイルについて

    お早う御座います。 Cの初心者です、宜しくお願いします。 「#include <Windows.h>」というヘッダファイルはどのようなプログラムを書いたときにincludeしてやる必要があるのでしょうか。 宜しくお願いします。

  • C言語のヘッダファイルの使い方

    ヘッダファイルの使い方について質問です。 ソースファイルA、ソースファイルBで共有して使用したい変数がある場合、 Aでは「int a」と宣言し、Bでは「extern int a」と宣言すれば 同じ変数を共有出来ると認識しています。 それをヘッダファイルへ記述しておきたい場合にはどのように 宣言しておけば良いのでしょうか? ヘッダファイルに「int a」と宣言した場合は両方のソースファイルで includeした時に多重定義でエラーとなります。 では「extern int a」と宣言しておいて、両方のソースファイルで includeするのが正しいのでしょうか? 初歩的な質問で申し訳ないですが、有識者の方、教えてください。

  • ソースとヘッダについて

    VC++2008を使っています。これは他でもいえるのではないかと思いますが、一応プロジェクトの種類はWindowsFormアプリケーションです。 字数削減や書きなおしを楽にするために、ある程度のマクロを織り交ぜたコーディングをしたいのですが ソースに#defineしたものの効果範囲は、#undefの場所まで あるいはそれがなければそのソースの終了地点まで でしょうか? もしそうなら、ソースに書く分なら「別のソースに同じマクロを、全く違う定義をして使っても問題ない」という事でしょうか? ヘッダに書いた場合は、なんか#undef文を下の方に書いてもまるで上に書いたかのように「駄目」という判定になってしまったのですが、かといって#undefを書かないとそのヘッダをインクルードする他のヘッダにも影響を与えてしまうようで… これをどうにかできる方法はありませんか? また、ソースでは #pragma once などをしなくてもいいのですか? (あるいは書いてもソースはオブジェクトファイルに変換され、実質的にはコンパイル後に影響が出るため、プリプロセッサはコンパイル前に完了するので、ソースにこれを書いたところで無意味ということでしょうか?)

  • C++のヘッダーについて

    C++のプログラミングをしています そこで出てきた問題なのですが・・・ class Aのヘッダファイルa.hをほかのcppファイルにインクルードすると、 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません error C2146: 構文エラー : ';' が、識別子 'test' の前に必要です。 とほかのヘッダファイルでコンパイルエラーがでます ヘッダファイルをインクルードしたときのみこのエラーがでて困っています。 解決法や、ヒントになりそうな事例を知りませんでしょうか?

専門家に質問してみよう