初めまして。龍神録プログラミングの館でC++でのゲーム製作を勉強させてもらっています。
第5章において、
・変数の宣言はメインファイルmain.cppで行う必要がある。
・他のファイルで参照したい時は、他のファイルではextern宣言する必要がある。
・他のファイルで宣言した関数はメインファイルではextern宣言する必要がある。
との記述がありました。
この三つ目の「・他のファイルで宣言した関数はメインファイルではextern宣言する必要がある。」というところで躓きました。
変数などはメインファイルでGLOBALを定義することによって変数の宣言になったことはなんとなく理解しました。
しかし、ここでGLOBALを定義しているため、その後のfunction.hでも関数の宣言になってしまうのではないかと思いました。
本来ここではextern宣言をしたいはずなのに、externではないと思いました。
この点について、どなたかご教授してもらえないでしょうか。
まだC++について勉強し始めたばかりなので、基礎的な部分で理解できていませんでしたらすみません。
どうか、よろしくお願いします。
龍神録第5章について
Re: 龍神録第5章について
extern宣言をするとコード全体の中の他の部分に同じ宣言がされているということを示します。
ですから、externをつけた関数宣言が1つあれば、
他の部分で多重に宣言されていても問題ありません。
ただし定義は一度しかできません。 例えば1.のような場合は宣言に当たります(関数の処理内容は未定義)が、
2.のような変数の宣言は定義に当たります(グローバル変数は宣言と同時に0で初期化定義される)。
今回のご質問の内容に沿えば、
main.cpp以外のファイルで、function.h内の関数はextern宣言されるので、
main.cpp内ではextern宣言せずとも問題なく、
また、宣言された関数は他のファイルにて一度だけ定義されているので、
function.h内の関数は問題なくmain.cppから使うことができます。
この考えからいえば、main.cpp内の#define GLOBAL_INSTANCEのコードを
別のcppファイルに移しても、動作に異常は起きません。よろしければお試しください。
ですから、externをつけた関数宣言が1つあれば、
他の部分で多重に宣言されていても問題ありません。
ただし定義は一度しかできません。 例えば1.のような場合は宣言に当たります(関数の処理内容は未定義)が、
2.のような変数の宣言は定義に当たります(グローバル変数は宣言と同時に0で初期化定義される)。
今回のご質問の内容に沿えば、
main.cpp以外のファイルで、function.h内の関数はextern宣言されるので、
main.cpp内ではextern宣言せずとも問題なく、
また、宣言された関数は他のファイルにて一度だけ定義されているので、
function.h内の関数は問題なくmain.cppから使うことができます。
この考えからいえば、main.cpp内の#define GLOBAL_INSTANCEのコードを
別のcppファイルに移しても、動作に異常は起きません。よろしければお試しください。
Re: 龍神録第5章について
遅くなってすみません。お返事ありがとうございます。
>また、宣言された関数は他のファイルにて一度だけ定義されているので、
function.h内の関数は問題なくmain.cppから使うことができます。
この一度だけ定義というのは、下記のようなものを指すのでしょうか? また、共通のfunction.hで宣言された関数が他のファイルで定義されているのでmain.cppから使えるという認識で良いんでしょうか?
>また、宣言された関数は他のファイルにて一度だけ定義されているので、
function.h内の関数は問題なくmain.cppから使うことができます。
この一度だけ定義というのは、下記のようなものを指すのでしょうか? また、共通のfunction.hで宣言された関数が他のファイルで定義されているのでmain.cppから使えるという認識で良いんでしょうか?
Re: 龍神録第5章について
はい。具体的にはそういうものを指します。この一度だけ定義というのは、下記のようなものを指すのでしょうか?
そういった認識で良いと思います。また、共通のfunction.hで宣言された関数が他のファイルで定義されているのでmain.cppから使えるという認識で良いんでしょうか?
補足をすると、extern宣言したものは当然ですが必ず何処かで定義しなければなりません。
『龍神録プログラミングの館』様で、
と書かれているのはこのためです。(externを付けない宣言(定義)が必ず必要)・変数の宣言はメインファイルmain.cppで行う必要がある。
また、extern宣言は他のファイルで定義されたグローバル変数や関数を
そのファイル内で使うための許可証のようなものと見ても良いと思います。