ページ 11

ファイルの分割

Posted: 2009年6月08日(月) 19:33
by tune
ファイルの分割について、2つ質問があります。

まず、以下が、first.cppの内容です。
#include "Dxlib.h"
#include "second.cpp"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){

	ProcessMessage();
	if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 )return -1; //ウィンドウ化と初期化処理
	SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定

	printfDx("%d",san());
	WaitKey();

	DxLib_End();
	return 0;
}
そして以下が、second.cppの内容です。
int san(){
	return 3;
}
1つめの質問です。
上記の状態で実行しようとすると、
「既に定義されています」
「1つ以上の複数回定義されているシンボルが見つかりました」
といったエラーが出ました。

2つめの質問です。
second.cppの2行目の、
return 3;
の部分を、
return GetRand(10);
に変えたら、
「'GetRand': 識別子が見つかりませんでした」
といったエラーが出ました。


それぞれのエラーの原因がよくわかりません。
includeのやり方がおかしいのでしょうか?教えてください。
また、ぼくの質問の仕方に不備があれば指摘していただければと思います。

Re:ファイルの分割

Posted: 2009年6月08日(月) 19:57
by kazuoni
>1つめの質問です。
>2つめの質問です。

分割コンパイル
多重インクルードガード

と検索すればいろいろ出てきますよ。

#GetRand()はDxLib.hをインクルードすればよいです

Re:ファイルの分割

Posted: 2009年6月08日(月) 20:12
by box
> 1つめの質問です。
> 上記の状態で実行しようとすると、

実行しようとすると、とは、具体的にどのような操作を指していますか?

Re:ファイルの分割

Posted: 2009年6月08日(月) 20:12
by 紅葉
#include "second.cpp"

#include "second.h"

にかえて

second.hをつくりここに

int san(void);

とプロトコル宣言して実行してください。

includeではヘッダファイルを読み込むものです。

Re:ファイルの分割

Posted: 2009年6月08日(月) 20:28
by box
> includeではヘッダファイルを読み込むものです。

必ずしもそうとばかりは言い切れません。
ヘッダー以外、例えば.cや.cppをインクルードすることは、
いっこうに差し支えありません。

また、インクルードするのは、ファイルであるとも限らないそうです。

Re:ファイルの分割

Posted: 2009年6月08日(月) 20:34
by tune
>>kazuoniさん
キーワードを教えていただきありがとうございます。
いろいろ検索してみて、ヘッダファイルの用途が分かったような気がします。

>>boxさん
言葉が曖昧で失礼しました。コンパイルのことです。
インクルードは奥が深いものですね。調べてみたいと思います。

>>紅葉さん
おかげでできました。勉強になりました。
これで質問1は解決しました。

質問2(GetRandの件)ですが、second.cppでもDxlib.hをインクルードすることで解決しました。
しかし、すでにfirst.cppでDxlib.hをインクルードしているのに、
second.cppでもインクルードするというのが、どうも不可解です。
これはいわゆる多重インクルードにならないのでしょうか?
(まぁエラーが出なかったのですから多重ではないと思いますが…)
それと、これから先、さらにcppファイルを増やす際、
毎回Dxlib.hをインクルードしなくてはならないのでしょうか?

Re:ファイルの分割

Posted: 2009年6月08日(月) 20:54
by kazuoni
>しかし、すでにfirst.cppでDxlib.hをインクルードしているのに、
>second.cppでもインクルードするというのが、どうも不可解です。

ヘッダーでは多重インクルードガードがかかっていると思うので
問題ないです。

例えばですが、
DxLib.hをインクルードするヘッダーファイルhd.hを
first.cpp
second.cpp
の両ファイルでインクルードすれば、毎回DxLib.hを書かなくてもよくなります。

ですが、原則として、そのソースファイル中で必要なヘッダーを
随時インクルードしたほうが、管理もしやすいかと思います。
(無駄なインクルードも避けられる)

Re:ファイルの分割

Posted: 2009年6月08日(月) 21:02
by tune
すでにガードがかかっているということでしたか。

> ですが、原則として、そのソースファイル中で必要なヘッダーを
> 随時インクルードしたほうが、管理もしやすいかと思います。

言われてみればそうですね。
今日は理解が深まりました。ありがとうございました。