- ベストアンサー
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」をリンクさせてみたいので、教えていただけると嬉しいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (4)
- zwi
- ベストアンサー率56% (730/1282)
まず、プロタイプ宣言とextern宣言の理解が必要ですね。 それとこの際ですからプロタイプ宣言とextern宣言をヘッダに書く一般的なコーディングスタイルを実践されては?と思います。 各ソースにプロタイプ宣言とextern宣言を書くのはバグの元で良い書き方とは言えません。なぜバグの元なのかは考えてみてください。 ちなみにextern宣言を無闇に利用することは、コーディング上ダーティな行為とされていますので、くれぐれもご自重を。
お礼
ご回答ありがとうございます。 C言語初心者なものでexternの用途等をあまり理解していないので、もっと理解を深めていきます! プログラム上あまりきれいじゃないという事は頭に入れておきます。
- xceu
- ベストアンサー率25% (2/8)
まずコンパイラはプロトタイプ宣言を見つけて「とりあえず、このどこかにある関数(prg2のfunc)は引数も戻り値も受け取らない型で使われるんだな」と覚えておき、そのあとprg2のfuncに対して(実際宣言どおり定義が行われているか)型チェック(あともろもろ)を行いよければ無事コンパイルを通ります。(この時点で二つの.objファイルが生成される) そのあとコンパイラはリンカを自動で呼び出し、リンカはライブラリから必要なだけの情報(標準関数の中の一部や自作関数など)を取り出し、 .objファイルに付け加え、それを一つのファイルにまとめて.exeファイル(実行可能)を生成するということですね。 externは他のファイルにあるグローバル変数を参照するためのキーワードです。 >「prg1.cpp」と、「prg2.cpp」をリンクさせてみたい 作業フォルダに二つのファイルを置き実際にコンパイルさせてみれば、 できますよね。 だいじなのは「プロトタイプ宣言やextern」の存在理由でその使い方を よく理解するということですね。
お礼
ご回答ありがとうございます。 >だいじなのは「プロトタイプ宣言やextern」の存在理由でその使い方 >をよく理解するということですね。 以上がんばって理解します! externによるグローバル変数は、関数内部と外部に記述するのとでは、参照可能範囲が違ってくるという記述もあったので、その辺りも理解していきます。
- jacta
- ベストアンサー率26% (845/3158)
プロジェクトに必要なソースを追加するだけです。 もし、コマンドラインで操作したいのであれば、 cl prg1.cpp prg2.cpp とすればコンパイル~リンクができます。
お礼
ご回答ありがとうございます。 ソースファイルに「prg2.cpp」を追加したら実行できました。 ありがとうございます。
- D-Matsu
- ベストアンサー率45% (1080/2394)
とりあえず開発環境(OSとコンパイラ)の情報ください。
お礼
情報が曖昧ですいません。 windows XPでvisual studio 2005でC++を使っています。
お礼
ご回答ありがとうございます。 画像まで添付してもらって、とても分かりやすかったです。 ありがとうございました。