• 締切済み

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

二つのプログラムのリンクについてわからないことがあります。 //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

  • extern記憶クラス指定子を使う事について

    prg1.cpp----------------------------- #include<stdio.h> void func(void); int gg=5678; int main(void) { printf("main gg=%d\n",gg); func(); return 0; } ---------------------------------- prg2.cpp-------------------------- #include<stdio.h> extern int gg; void func(void) { printf("func gg=%d\n",gg); } ---------------------------------- 以上「prg1.cpp」と「prg2.cpp」という名前のふたつのファイルを作成し、「prg1.cpp」で宣言したグローバル変数を「prg2.cpp」で利用可能にしたいと思っています。 それには、「prg1.cppをコンパイルし、prg2.cppもコンパイルして、両者のオブジェクト(コンパイル後のファイル)をリンクする」と参考書には書いてあったのですが、どのようにしたらリンクされるのかわかりません。 prg.1cpp---------------------- #include<stdio.h> void func(void); int gg=5678; int main(void) { printf("main gg=%d\n",gg); func(); return 0; } #include<stdio.h> extern int gg; void func(void) { printf("func gg=%d\n",gg); } ------------------------------- 以上のように、「prg1.cpp」のファイルに1つにまとめれば、なぜかよくわかりませんが実行できました。 しかし「prg1.cpp」と、「prg2.cpp」をリンクさせてみたいので、教えていただけると嬉しいです。

  • 【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい

    【VS2008 C++】2つのプロジェクト間で共通の関数を使いたい WindowsXP上で visual studio 2008 C++ express editionを 使用しています。 1つのソリューションに2つのプロジェクトをつくり、 その2つに共通の関数を使用させたいのですが、どのように 設定すればよいか教えて頂けませんでしょうか。 ソースの内容は以下のとおりです。 具体的には、mainB.cppでcommon.cppの関数を 呼び出したいです。 //common.cpp #include <stdio.h> void showCommon(){ printf("---common-----\n"); } //common.h #include<stdio.h> void showCommon(); //mainA.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainA-----\n"); showCommon(); } //mainB.cpp #include<stdio.h> #include "common.h" void main(){ printf("---mainB-----\n"); showCommon(); }

  • C++のコンパイルエラーが

    おこります。 --------------------------------- #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } -------------------------------------- をコンパイルするのですができません。 以下のエラーが出ます。 --------------------------------------- エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** -------------------------------------

  • C言語プログラミングについて

    #include <stdio.h> int main(void) { printf("hello,world\n"); } □■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■ #include <stdio.h> int main(void) { printf("hello"); printf(",world"); printf("\n"); } 上の2つのプログラムをコンパイルするとどのような違いが生じるんですか??printfってどんな働きをするんですか?

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • プログラムの添削

    以下のような数当てゲームを作りました.なるべくうまいプログラムを書けるようになりたいのですが,どのような改善点がありますか?よろしくお願いします. /*数当てゲームを作りなさい.*/ #include<stdio.h> void maegaki(void); /*このように関数を定義しまくることに意味はあるのか?main関数はすっきりするけど.*/ void in_check_out(int i); int main(void) { int i; int j; maegaki(); for(j=0;j<10;j++) { scanf("%d",&i); in_check_out(i); if(!(i-1)) return 0; printf("残り%d回です.\n",9-j); } return 0; } void maegaki(void) { printf("数当てゲームをはじめます.\nぼくの好きな整数を当ててください.\nチャンスは10回です.\nヒントはボゾン\n"); } void in_check_out(int i) { if(!(i-1)) { printf("正解!答えは1です.\n"); } else { printf("残念!\n"); if(i>1) printf("%dより小さいです.\n",i); else printf("%dより大きいです.\n",i); } }

  • 別のファイルの値を得るには?

    ファイルを分割して関数を別のファイルにおいたのですが値を返してもらおうとしても帰ってきません どのようにしたら関数の値を得られますか? 大体このような感じですね ---main.cppの内容--- #include <stdio.h> #include "betu.h" void main( void ){ printf( "%d" , a ); } ---betu.hの内容--- static int a; void betu( void ); ---betu.cppの内容--- void betu( void ){ a = 5; }

  • C言語について

    #include <stdio.h> int main(void) { printf("123456\tABC DEFGHIJK\n"); printf("2006/4/14\n"); printf("programing\n"); } のprintfをすべてputsに書き換えてコンパイル・実行すると、 #include <stdio.h> int main(void) { puts("123456\tABC DEFGHIJK\n"); puts("2006/4/14\n"); puts("programing\n"); } になると思うんですけど、そのputsを用いて上のprintfを用いたプログラムと同じ出力を得るにはどのようなプログラムに変えればいいのでしょうか?

  • コンパイルすると『breakの位置が誤っている』『elseの位置が誤っている』となるのは何故?

    C言語初心者です。 テキストを真似たつもりで自作してみましたが、コンパイルすると下記のようにエラーが出ます。 エラー E2030 hello.cpp 11: break の位置が誤っている(関数 main() ) エラー E2054 hello.cpp 12: else の位置が誤っている(関数 main() ) エラー E2030 hello.cpp 14: break の位置が誤っている(関数 main() ) 特に問題はないように思うのですが。何故でしょうか? 解説宜しくお願いします。 #include <stdio.h> int main(void) { int a; a = getchar(); if(a == 9) printf("入力値は%dです。\n",a); break; else printf("入力値は9ではなく %dです。\n",a); break; }

  • borlandについて

    こんばんは Borland C++ Compiler 5.5 を使っているのですが… _______________ |#include <stdio.h>      |←のようなプログラムをコンパイル |               | したら |int main(void) |1:インクルードファイル'stdio.h'を |{              | オープン出来ない | printf("Hello.\n");   |5:プロントタイプ宣言のない関数 | return 0;        | 'printf'の呼び出し(関数mein) |}              |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ と出てきますどうしたらよいでしょうか。