別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
Ofu
記事: 11
登録日時: 8年前
連絡を取る:

別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

#1

投稿記事 by Ofu » 8年前

別ヘッダで#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];		

教えて頂ける方がございましたら、どうかよろしくお願いいたします。

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

Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

#2

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

適当な条件で実験をしましたが、エラーは出ませんでした。
http://melpon.org/wandbox/permlink/IysTel4JC1OsjXGV

エラーメッセージをそのまま(ユーザー名などの個人情報は隠して)提示していただくか、
最小限の・自己完結した・確認可能なサンプルコードを提示してください。
オフトピック
定義しているヘッダをincludeしていないからエラーが出ている気がします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Ofu
記事: 11
登録日時: 8年前
連絡を取る:

Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

#3

投稿記事 by Ofu » 8年前

みけ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つとなります。

不備がありましたら申し訳ございません。

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

Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

#4

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

提示された情報では問題を再現できませんでした。
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の内容、特に(あれば)インクルードガードとインクルードしているヘッダ(順番を含む)を教えていただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Ofu
記事: 11
登録日時: 8年前
連絡を取る:

Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

#5

投稿記事 by Ofu » 8年前

わざわざ検証して頂きありがとうございます。


エラーを起こしているのはCharaData.hです。

使用している定数は別のヘッダから間接的にインクルードしたものです。

また、GameMain.hの内容は、

コード:

/********** GameMain.h ***********/

#ifndef INCLUDE_GAMEMAIN
#define INCLUDE_GAMEMAIN												
/************* ヘッダファイルインクルード***********/

#include "WinMain.h"																			

/************* プロトタイプ関数宣言 *************/

void GameMain();														

#endif
となっております。

また、#pragma onceも使っており、インクルードする順番は特に決めてはいないつもりです。(結果的にはWinMain.hの順番となりますが)

説明と要約が下手ですみません。

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

Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

#6

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

ソースファイルから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 (ガードにより無効)
        (定数の使用)
    (定数の定義)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Ofu
記事: 11
登録日時: 8年前
連絡を取る:

Re: 別ヘッダで#defineで定義したはずの定数が定義されてませんと怒られるのですが…

#7

投稿記事 by Ofu » 8年前

みけCAT様、ありがとうございます!
定数を使用する部分とインクルードの順番を変えたら解決しました。

度々検証までしていただき、本当に有難うございました。

閉鎖

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