今までは、Webプログラミングを行っていたのですが、
最近になって、C++の仕事を請け負いましたので、
C++を勉強しつつ、プログラムをしていたのですが、
Webプログラムとの違いに悩んでいる部分があります。
それは、ヘッダファイルとソースファイルの関係についてです。
ほかのファイルから、インクルードされたヘッダファイルが、
読み込まれるというのは納得がいくのですが、
そのヘッダファイルに関連付け(?)られたソースファイルも、
一緒に読み込まれるという理由がわかりません。
ヘッダファイルでソースファイルを読んでいるような記述もないような感じなので、とても疑問に思っております。
なぜ、ヘッダファイルをインクルードしただけで、付属のソースファイルも読み込まれるのでしょうか?
No.3ベストアンサー
- 回答日時:
> main.cppを起動した時に、kansuuのヘッダファイルしか呼んでいないのに、kansuu.cppの処理内容「あいうえお」がしっかりと表示されてしまうのはなぜなんでしょうか?
結論から言うと、実行ファイルの中にkansuu.cppをコンパイルしたものも入っているからです。
printf()の話と同じことなのですが、kansuu.cpp, main.cppをコンパイルすると、それぞれに対応したオブジェクトファイルというものが作られ、さらにそれらのオブジェクトファイル全部と標準ライブラリなどを全てくっつけて(リンクして)、最終的な実行ファイルが作られます。
逆に言うと、オブジェクトファイルをくっつけてないとソース内でヘッダをincludeしていても「関数がありません」のようなコンパイルエラーになります。
この、どのオブジェクトファイルをリンクするか、というのは実行ファイルを作る最終段階のコンパイラ実行(実際にはリンカというプログラムの実行)のときに指定します。
もしかしたら指定している意識がないのかもしれませんが、どこかで指定しているはずです。
統合開発環境ならソース追加で自動的に設定してくれることがあります。
ご回答ありがとうございます。
なるほど!今までは、すでに整っている制作環境でプログラムを行っていたために、指定しているという意識がなかっただけで、
実際は、PHPでSmartyのパスを指定するように、リンクするパスを指定している場所があるんですね。
納得致しました。
どうもありがとうございました!
No.2
- 回答日時:
#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>
---------------------------------------
上記のような感じで、次の処理を呼び出す場合は、
どこを呼び出すかがソース上に書いてあるため、わかりやすいのですが・・・
No.1
- 回答日時:
えーと例えば、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の処理内容「あいうえお」がしっかりと表示されてしまうのはなぜなんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Makefile作成時の拡張子.oとは?
-
” OS ビルド ” の意味が分か...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
C言語でヘッダファイルにグロー...
-
デコンパイル?について
-
【VC++6.0(MFC)】警告「LINK : ...
-
C/C++の文法チェックツール
-
外部シンボル "_main"は未解決です
-
C言語についてです。 Macを使用...
-
outportb関数について
-
ILSpyで、デコンパイルできない。
-
C言語のコンパイルができません
-
不要な #include
-
プリコンパイルエラーについて
-
定数式とはどういう意味でしょ...
-
C++コンパイル時に『 C1083: in...
-
クリティカルエラー Expressio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
” OS ビルド ” の意味が分か...
-
1 つ以上の複数回定義されてい...
-
「fatal error C1189」を回避す...
-
エクセルVBAではRound...
-
Makefile作成時の拡張子.oとは?
-
C言語でヘッダファイルにグロー...
-
ILSpyで、デコンパイルできない。
-
セミコロンについて
-
<math.h>があるのにsqrtが・...
-
クリティカルエラー Expressio...
-
外部シンボル "_main"は未解決です
-
マクロ コンパイルがグレーバック
-
[c++] <pthread.h>がinclude で...
-
C++コンパイル時に『 C1083: in...
-
【VC++6.0(MFC)】警告「LINK : ...
-
ビルドとリビルドの違いを教え...
-
コンパイルエラー:ユーザ定義...
-
VB6で開発中…標準モジュール間...
-
コンパイル??
おすすめ情報