定義ファイル2重インクルード防止が出来ない。

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

定義ファイル2重インクルード防止が出来ない。

#1

投稿記事 by RIO » 10年前

こんにちは、関連スレッドを見てみたのですが解決に至らなかったので質問させていただきます。
load関数とpraph関数で共通して使うファイルをdefine.hというファイルにまとめてかいて、それぞれのファイルでインクルードしたのですが、2重エラーが起きました。define.hをインクルードガードしましたが治りません。

エラーとソースは以下になります。

エラー
load.obj : error LNK2005: "int * img_player" (?img_player@@3PAHA) は既に graph.obj で定義されています。
1>C:\i2-hougyoku\isekai-h\Debug\isekai-h.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

ソース

//define.h

コード:

 
#ifndef INCLUDED_DEFINE
#define INCLUDED_DEFINE

//描画だの被るやつの定義用
#include "../include/DxLib.h";

int img_player[12];	//今回playerはエナのみなので1つだけ 正面、→、←でそれぞれアニメーション4枚ずつ、計12枚

#endif
//struct.h

コード:

 
#pragma once
#include "../include/DxLib.h";

//構造体とかのやつ
//キャラクターに関する構造体
typedef struct{
        int flag;       //フラグ
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int img;        //画像
        int slow;       //スローかどうか
        double x,y;     //座標
}player_st;

//構造体を使うための宣言
player_st player;

#endif
//include.h

コード:

 
//ヘッダファイルどんどん追加する
#include "../include/DxLib.h";
#include "key.h";
#include "load.h";
#include "graph.h";
//load.h

コード:

 
void load();
//graph.h

コード:

 
void graphMain();
//load.cpp

コード:

 
#include "../include/DxLib.h";
#include "define.h";

//ロード関数形書き込み
char* imgPlayer="../dat/img/char/player.png";	//playerファイル名

void load(){
	//自機画像読み込み
	LoadDivGraph(imgPlayer,12,4,3,73,73,img_player) ;

	//敵画像読み込み

	//弾画像読み込み
}
#include "../include/DxLib.h";

//graph.cpp

コード:

#include "define.h";
#include "struct.h";

void graphPlayer(){

	DrawRotaGraphF(player.x,player.y,1.0,0.0,img_player[0],TRUE);
}

void graphMain(){
	graphPlayer();
}
//main.cpp

コード:

#include "include.h"

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	return 0;
}


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);//ウィンドウモード
	
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化


	int page = 0;

	//ロード
	load();


	while(ProcessLoop()==0&&CheckStateKey(KEY_INPUT_ESCAPE)==0){//メインループ

		graphMain();




		ScreenFlip();//裏画面反映
	}

	DxLib_End();//DXライブラリ終了処理
	return 0;
}

エラーの原因は2重インクルードしているdefine.hだと思いますが、プログラム内で参照しているファイルもすべて書きました。
見辛いかもしれませんが、よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 定義ファイル2重インクルード防止が出来ない。

#2

投稿記事 by softya(ソフト屋) » 10年前

> 定義ファイル2重インクルード防止が出来ない。

インクルードガードの問題ではなく、ヘッダに実体定義を書いたためにcppファイルの数だけ実体定義されてしまったため起きたエラーです。
ヘッダは外部参照の宣言だけにします。
extern int img_player[12]; //今回playerはエナのみなので1つだけ 正面、→、←でそれぞれアニメーション4枚ずつ、計12枚
extern player_st player;
に書き換えてください。
なお実体は、それぞれのcppに定義をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

RIO

Re: 定義ファイル2重インクルード防止が出来ない。

#3

投稿記事 by RIO » 10年前

指摘されたところを直したところ、コンパイルできました。ありがとうございます。
Cは覚えることが多くて難しいですね…orz

RIO

Re: 定義ファイル2重インクルード防止が出来ない。

#4

投稿記事 by RIO » 10年前

解決ボックスにチェック入れるの忘れていましたorZ

box
記事: 2002
登録日時: 14年前

Re: 定義ファイル2重インクルード防止が出来ない。

#5

投稿記事 by box » 10年前

それはそうとして、
#include
の最後のカンマ、不要です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 定義ファイル2重インクルード防止が出来ない。

#6

投稿記事 by みけCAT » 10年前

box さんが書きました:それはそうとして、
#include
の最後のカンマ、不要です。
セミコロンのことでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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