• 締切済み

二つのプログラムのリンクについて

二つのプログラムのリンクについてわからないことがあります。 //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()関数が呼び出されるのですか?

みんなの回答

  • eternalx
  • ベストアンサー率35% (7/20)
回答No.2

コンパイルするときにリンカを通してリンクするようにされているのでそれで問題ありません。(複数のプログラムファイルを結合しているため) 関数宣言をしておくと、使えるようになります。 詳しく流れを知りたければデバッガを使用するといいです。 gccなどのオープンソース系のものをお使いならばgdbを使う人が多く、VC++などの場合は付属のデバッガを使っている場合が多いです。 デバッガがあれば流れを知ることができるのです。この作業のことをデバッグといいます。

shomarket
質問者

お礼

ありがとうございます。なんとなくですが理解できました。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

sample1.cppやsample2.cppをそれぞれソースファイルと呼びますので ”同じソースファイル内に作り”という表現は変です ”同じプロジェクト内に作り”なら通じます。 それぞれのソースファイルは別々にコンパイルされますがその中で呼び出されている関数部分はまだ具体的な値は入っていません。 リンクの時点でその関数の実体を探して値が決められます。 コンパイル時点では関数の名前と引数、戻り値がわかっていればいいのです。

shomarket
質問者

お礼

たしかに言われるとおり"同じプロジェクト内に作り"の方が通じますね。すいませんでした。 問題も解決できました。ありがとうございました。

関連するQ&A