ページ 11

龍神録の5章についての疑問

Posted: 2010年11月11日(木) 18:52
by seaview
初めまして、seaviewと申します。
現在、龍神録のサイトで学習しているのですが、5章を読み終えて、疑問に思ったことがあります。
5章「宣言の仕方を工夫しよう」でいくつか疑問に思ったことがあります。
(5章→http://dixq.net/rp/5.html

まず一つは、
5章の例の場合では、main.cppで
#define GLOBAL_INSTANCE
をし、次にGV.hをincludeすることによって、グローバル変数の実体を定義している、ということですよね。
main.cppのみグローバルインスタンスをdefineすることで、他のファイルでは、こういう変数があるよという
ことを宣言するものとして扱うことができる、ということですよね。

そこで思うのですが、グローバル変数をmain.cpp内で定義しなくてはならないのは、なぜなのでしょうか?
それについて私が思ったことは、グローバル変数の実体を確保するためだけのcppファイルを用意する、という
方法です。
http://oshiete.goo.ne.jp/qa/1346136.html
↑ここの回答No.2を参考にしてます)

5章冒頭で、
「・変数の宣言はメインファイルmain.cppで行う必要がある。」
とありましたが、これがどうしてなのか?という旨で違いないと思います。

そして、main.cppで定義しなくてはいけないとすると、
先ほどのリンク先の回答No.2の方法では、
main.cpp以外である別のファイルでやってるようですが、
一体どういうことなのでしょうか??



また、同じくGV.hでインクルードされているfunction.h内では関数にGLOBALがついていますよね。
関数のプロトタイプ宣言のとき、externがついても、ついてなくても、externが付いているのと同じ、
ということを聞きました。
なので、このfunction.h内の関数のプロトタイプ宣言についているGLOBALというのは、
GLOBAL、またはextern、または空白でもよい、ということでいいのでしょうか?


初歩的な質問で申し訳ありません。。。過去ログさがしてみたり、googleでも検索してみたのですが、
いまいち、よくわかりませんでした・・、
ちなみに、私のC言語のスキルはまだC言語入門書を1冊読破した程度であり、
分割コンパイルやライブラリ作成の知識は浅いです。
そんなわけですが、ご回答よろしくお願いいたしますm(__)m 画像

Re:龍神録の5章について

Posted: 2010年11月11日(木) 19:45
by softya
別にメインで定義する必要はありません。
何処かのcppで定義しなかればいけないので、「今回はmainで定義するものとします」程度の意味だと思ってください。

あと関数にGLOBALは付いてい無くでも動作は変わりませんが、外部公開しないstatic関数と同名のものを作るケアレスミスは防ぐ効果があると思います。まぁ、予防策程度の効果と考えておいてください。

Re:龍神録の5章について

Posted: 2010年11月11日(木) 20:51
by seaview
回答ありがとうございますm(__)m
このことについて、何日か考えていたのですが、ようやく理解でき、
試しにファイル分割のテストプログラムを作成したところ、正常に動作しました。
感謝です。 画像

Re:龍神録の5章について

Posted: 2010年11月11日(木) 22:25
by Dixq (管理人)
別にどこで定義してもかまいません。

ただmainは必ず存在するファイルなので、
mainで定義して、それ以外ではexternすると決めた方が解りやすいかなと思ってそうしました。

館では「とりあえず動くものを作りたい」という人にむけたコードなのであのようになっていますが、
グローバル変数を使うなら使用するファイルで宣言し、なるべく他のファイルから直接書き換わるような事が無いように設計するのがよいでしょう。
現在の仕様ではヘッダを1行でも書きかえたらプロジェクト全体を再コンパイルしないといけませんので、無駄が多いですね。

全体で一つしか実体が存在しない物については私もファイル内の範囲でグローバル変数を使いますが、
そうではない場合は、モジュールに変数のポインタを渡すような設計にすると効率的になるでしょう。