龍神録第5章について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クマー

龍神録第5章について

#1

投稿記事 by クマー » 14年前

初めまして。龍神録プログラミングの館でC++でのゲーム製作を勉強させてもらっています。

第5章において、
・変数の宣言はメインファイルmain.cppで行う必要がある。
・他のファイルで参照したい時は、他のファイルではextern宣言する必要がある。
・他のファイルで宣言した関数はメインファイルではextern宣言する必要がある。
との記述がありました。
この三つ目の「・他のファイルで宣言した関数はメインファイルではextern宣言する必要がある。」というところで躓きました。
変数などはメインファイルでGLOBALを定義することによって変数の宣言になったことはなんとなく理解しました。
しかし、ここでGLOBALを定義しているため、その後のfunction.hでも関数の宣言になってしまうのではないかと思いました。
本来ここではextern宣言をしたいはずなのに、externではないと思いました。

この点について、どなたかご教授してもらえないでしょうか。
まだC++について勉強し始めたばかりなので、基礎的な部分で理解できていませんでしたらすみません。
どうか、よろしくお願いします。

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

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

#2

投稿記事 by kimuchi » 14年前

extern宣言をするとコード全体の中の他の部分に同じ宣言がされているということを示します。
ですから、externをつけた関数宣言が1つあれば、
他の部分で多重に宣言されていても問題ありません。
ただし定義は一度しかできません。

コード:

//ヘッダ内のコードを仮定
//1.
void hoge(int);
//2.
int hoge;
例えば1.のような場合は宣言に当たります(関数の処理内容は未定義)が、
2.のような変数の宣言は定義に当たります(グローバル変数は宣言と同時に0で初期化定義される)。

今回のご質問の内容に沿えば、
main.cpp以外のファイルで、function.h内の関数はextern宣言されるので、
main.cpp内ではextern宣言せずとも問題なく、
また、宣言された関数は他のファイルにて一度だけ定義されているので、
function.h内の関数は問題なくmain.cppから使うことができます。

この考えからいえば、main.cpp内の#define GLOBAL_INSTANCEのコードを
別のcppファイルに移しても、動作に異常は起きません。よろしければお試しください。

クマー

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

#3

投稿記事 by クマー » 14年前

遅くなってすみません。お返事ありがとうございます。

>また、宣言された関数は他のファイルにて一度だけ定義されているので、
function.h内の関数は問題なくmain.cppから使うことができます。

この一度だけ定義というのは、下記のようなものを指すのでしょうか?

コード:

#include "../include/GV.h"

//一番最初の初期化
void first_ini(){
        ch.x=FIELD_MAX_X/2;
        ch.y=FIELD_MAX_Y*3/4;
}
また、共通のfunction.hで宣言された関数が他のファイルで定義されているのでmain.cppから使えるという認識で良いんでしょうか?

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

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

#4

投稿記事 by kimuchi » 14年前

この一度だけ定義というのは、下記のようなものを指すのでしょうか?
はい。具体的にはそういうものを指します。
また、共通のfunction.hで宣言された関数が他のファイルで定義されているのでmain.cppから使えるという認識で良いんでしょうか?
そういった認識で良いと思います。

補足をすると、extern宣言したものは当然ですが必ず何処かで定義しなければなりません。
『龍神録プログラミングの館』様で、
・変数の宣言はメインファイルmain.cppで行う必要がある。
と書かれているのはこのためです。(externを付けない宣言(定義)が必ず必要)

また、extern宣言は他のファイルで定義されたグローバル変数や関数を
そのファイル内で使うための許可証のようなものと見ても良いと思います。

クマー

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

#5

投稿記事 by クマー » 14年前

なるほど、やっと理解することが出来ました。
教えてくださり、ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る