ページ 1 / 1
別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…
Posted: 2017年2月06日(月) 05:55
by Ofu
別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが、私にはまったく理解できませんでした。
どなたか、教えて頂けないでしょうか。
コード:
/*********SystemValue.h************/
#define MONSTER_MAX_1MAP 20 // 今回使う定数
#define CHARA_GRAPHIC_DIV 112
#define CHARA_KIND_MAX 20
/*********WinMain.h*****************/
#include "DxLib.h" // ここですべてのヘッダファイルをインクルード
#include "GameMain.h"
#include "SystemValue.h"
#include "CharaData.h"
/*********CharaData.h***************/
extern CHARAKINDDATA CharaKindData[CHARA_KIND_MAX]; // ここで使うとエラーが出る
extern CHARAONEDATA CharaOneData[MONSTER_MAX_1MAP+2];
/*********CharaData.cpp************/
CHARAKINDDATA CharaKindData[CHARA_KIND_MAX]; // なぜかここでは使える
CHARAONEDATA CharaOneData[MONSTER_MAX_1MAP+2];
教えて頂ける方がございましたら、どうかよろしくお願いいたします。
Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…
Posted: 2017年2月06日(月) 07:43
by みけCAT
適当な条件で実験をしましたが、エラーは出ませんでした。
http://melpon.org/wandbox/permlink/IysTel4JC1OsjXGV
エラーメッセージをそのまま(ユーザー名などの個人情報は隠して)提示していただくか、
最小限の・自己完結した・確認可能なサンプルコードを提示してください。
オフトピック
定義しているヘッダをincludeしていないからエラーが出ている気がします。
Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…
Posted: 2017年2月06日(月) 16:14
by Ofu
みけCAT様、問題がありそうなところは大体このくらいです。
コード:
/*********SystemValue.h************/
#ifndef INCLUDE_SYSTEMVALUE
#define INCLUDE_SYSTEMVALUE
// ヘッダインクルード
#include"WinMain.h"
// 定数定義
#define MONSTER_MAX_1MAP 20 // 今回使う定数
#define CHARA_GRAPHIC_DIV 112
#define CHARA_KIND_MAX 20
#endif
/*********WinMain.h*****************/
#ifndef INCLUDE_WINMAIN
#define INCLUDE_WINMAIN
// ヘッダインクルード
#include "DxLib.h" // ここですべてのヘッダファイルをインクルード
#include "GameMain.h"
#include "SystemValue.h"
#include "CharaData.h"
#endif
/*********CharaData.h***************/
#ifndef INCLUDE_CHARADATA
#define INCLUDE_CHARADATA
// ヘッダインクルード
#include"WinMain.h"
// 構造体・変数宣言(ここでSystemValue.hで定義したはずの定数を使うとエラーが出る)
struct CHARAKINDDATA {
CHARACODE CharaCode = Nanasi;
int Graphic[CHARA_GRAPHIC_DIV];
};
extern CHARAKINDDATA CharaKindData[CHARA_KIND_MAX];
extern CHARAONEDATA CharaOneData[MONSTER_MAX_1MAP+2];
#endif
/*********CharaData.cpp************/
// ヘッダインクルード
#include"CharaData.h"
// 変数定義(ここで使うとなぜかエラー出ない)
CHARAKINDDATA CharaKindData[CHARA_KIND_MAX];
CHARAONEDATA CharaOneData[MONSTER_MAX_1MAP+2];
サンプルコードとまではいかず申し訳ありません。
しかし問題のありそうなところは大体このくらいとなります。
また、エラーメッセージの方は
エラー C2065 'CHARA_GRAPHIC_DIV': 定義されていない識別子です。 testDX c:\users\ofu\documents\visual studio 2015\projects\testdx\charadata.h 53
エラー C2065 'CHARA_KIND_MAX': 定義されていない識別子です。 testDX c:\users\ofu\documents\visual studio 2015\projects\testdx\charadata.h 64エラー C2065 'MONSTER_MAX_1MAP': 定義されていない識別子です。 testDX c:\users\ofu\documents\visual studio 2015\projects\testdx\charadata.h 66
これら3つとなります。
不備がありましたら申し訳ございません。
Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…
Posted: 2017年2月06日(月) 17:07
by みけCAT
提示された情報では問題を再現できませんでした。
http://melpon.org/wandbox/permlink/yreIk5HYqBFORor6
循環参照の可能性を疑いましたが、解析しても問題はなさそうに思えます。
コード:
CharaData.cpp
CharaData.h
WinMain.h
DxLib.h
(省略)
GameMain.h
?????
SystemValue.h
WinMain.h (ガードにより無効)
(定数の定義)
CharaData.h (ガードにより無効)
(定数の使用)
エラーを起こしているのは、このCharaData.cppからインクルードされたCharaData.hですか?
別のヘッダを直接インクルードしている他のソースファイルから間接的にインクルードされたものではないですか?
また、GameMain.hの内容、特に(あれば)インクルードガードとインクルードしているヘッダ(順番を含む)を教えていただけますか?
Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…
Posted: 2017年2月06日(月) 18:34
by Ofu
わざわざ検証して頂きありがとうございます。
エラーを起こしているのはCharaData.hです。
使用している定数は別のヘッダから間接的にインクルードしたものです。
また、GameMain.hの内容は、
コード:
/********** GameMain.h ***********/
#ifndef INCLUDE_GAMEMAIN
#define INCLUDE_GAMEMAIN
/************* ヘッダファイルインクルード***********/
#include "WinMain.h"
/************* プロトタイプ関数宣言 *************/
void GameMain();
#endif
となっております。
また、#pragma onceも使っており、インクルードする順番は特に決めてはいないつもりです。(結果的にはWinMain.hの順番となりますが)
説明と要約が下手ですみません。
Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…
Posted: 2017年2月06日(月) 22:50
by みけCAT
ソースファイルからSystemValue.hのみをインクルードすると、エラーが出ました。
http://melpon.org/wandbox/permlink/KIGnwEVCk4a5MaYA
コード:
In file included from WinMain.h:8:0,
from SystemValue.h:5,
from prog.cc:1:
CharaData.h:10:14: error: 'CHARA_GRAPHIC_DIV' was not declared in this scope
int Graphic[CHARA_GRAPHIC_DIV];
^~~~~~~~~~~~~~~~~
CharaData.h:13:36: error: 'CHARA_KIND_MAX' was not declared in this scope
extern CHARAKINDDATA CharaKindData[CHARA_KIND_MAX];
^~~~~~~~~~~~~~
CharaData.h:14:34: error: 'MONSTER_MAX_1MAP' was not declared in this scope
extern CHARAONEDATA CharaOneData[MONSTER_MAX_1MAP+2];
^~~~~~~~~~~~~~~~
このように、ソースファイルからSystemValue.hをインクルードすると、定数の定義より使用が先に来てエラーになってしまいますね。
コード:
prog.cc
SystemValue.h
WinMain.h
DxLib.h
(省略)
GameMain.h
WinMain.h (ガードにより無効)
SystemValue.h (ガードにより無効)
CharaData.h
WinMain.h (ガードにより無効)
(定数の使用)
(定数の定義)
Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…
Posted: 2017年2月08日(水) 18:18
by Ofu
みけCAT様、ありがとうございます!
定数を使用する部分とインクルードの順番を変えたら解決しました。
度々検証までしていただき、本当に有難うございました。