- 締切済み
二つのプログラムのリンクについて
二つのプログラムのリンクについてわからないことがあります。 //sample1.cpp #include <stdio.h> void mod1_disp(void); void mod2_disp(void); int err_ct1 = 0; int main(void) { err_ct1 = 111; mod1_disp(); mod2_disp(); mod1_disp(); return 0; } void mod1_disp(void) { printf("mod1:err_ct1=%d\n", err_ct1); } というプログラムと //sample2.cpp #include <stdio.h> void mod2_disp(void); void mod2_disp2(void); int err_ct2 = 0; void mod2_disp(void) { err_ct2 = 222; mod2_disp2(); } void mod2_disp2(void) { printf("mod2:err_ct2=%d\n", err_ct2); } というプルグラムを同じソースファイル内に作り、実行すると結果は mod1:err_ct1=111 mod2:err_ct2=222 mod1:err_ct1=111 となります。 そこで mod2:err_ct2=222 の部分がどのような道筋をたどって表示されているのかよくわかりません。sample1.cpp では sample2.cpp と共通の void mod2_disp(void)宣言 があり、main関数の中で mod2_disp()関数を実行していますが、これで sample2.cpp の mod2_disp()関数が呼び出されるのですか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- eternalx
- ベストアンサー率35% (7/20)
コンパイルするときにリンカを通してリンクするようにされているのでそれで問題ありません。(複数のプログラムファイルを結合しているため) 関数宣言をしておくと、使えるようになります。 詳しく流れを知りたければデバッガを使用するといいです。 gccなどのオープンソース系のものをお使いならばgdbを使う人が多く、VC++などの場合は付属のデバッガを使っている場合が多いです。 デバッガがあれば流れを知ることができるのです。この作業のことをデバッグといいます。
- php504
- ベストアンサー率42% (926/2160)
sample1.cppやsample2.cppをそれぞれソースファイルと呼びますので ”同じソースファイル内に作り”という表現は変です ”同じプロジェクト内に作り”なら通じます。 それぞれのソースファイルは別々にコンパイルされますがその中で呼び出されている関数部分はまだ具体的な値は入っていません。 リンクの時点でその関数の実体を探して値が決められます。 コンパイル時点では関数の名前と引数、戻り値がわかっていればいいのです。
お礼
たしかに言われるとおり"同じプロジェクト内に作り"の方が通じますね。すいませんでした。 問題も解決できました。ありがとうございました。
お礼
ありがとうございます。なんとなくですが理解できました。