ページ 11

ヘッダの分割について

Posted: 2014年6月22日(日) 11:45
by うずら
こんにちは。C++(DXLib使用)でゲーム作成をしているんですがグローバル変数、関数などのヘッダファイル分割で
いくつか疑問があります。

1,DXライブラリの関数extern int AppLogAdd( const TCHAR *String , ... ) ;
 の定義を直接このヘッダに書いてもコンパイルエラーが出てしまいます。理由と解決策を教えてください。
 (DXLib.hをインクルードせずに必要な関数宣言だけこのヘッダのインクルードで使えるようにしたい)

2,個々のソースファイルでのインクルードをなるべく減らせるように書き方を工夫してみたんですが、
 改良したほうがいい点などはありますか?

コード:


// グローバル変数。グローバル定数も自動でインクルード。

# ifndef  IG_EXTERN_CPP

# define IG_EXTERN_CPP

# include "const.h"

# ifdef EXTERN_CPP   // Extern.cppで実態を宣言するためのマクロ
  # define Extern

  # include "Image.h"
  # include "Input.h"
  # include "Own.h"
  # include "Enemy.h"
  # include "EnemyBullet.h"
  # include "md5.h"
  # include "GameProperty.h"

  JOYSTATE          lcJoy1, lcJoy2;
  Image             lcCv;
  Own               lcown1;
  Own               lcown2;
  OwnBulletManage   lcOBulManage;
  EnemyManage       lcEneManage;
  EnemyBulletManage lcEBulManage;
  MD5               lcmd5;
  Score             lcscore;

  JOYSTATE          &Joy1 = lcJoy1, &Joy2 = lcJoy2;
  Image             &Cv = lcCv;
  Own               &own1 = lcown1;
  Own               &own2 = lcown2;
  OwnBulletManage   &OBulManage = lcOBulManage;
  EnemyManage       &EneManage = lcEneManage;
  EnemyBulletManage &EBulManage = lcEBulManage;
  MD5               &md5 = lcmd5;
  Score             &score = lcscore;

# else

//
  struct JOYSTATE;
  class  Image;
  class  Own;
  class  OwnBulletManage;
  class  EnemyManage;
  class  EnemyBulletManage;
  class  MD5;
  class  Score;
  
//
  extern JOYSTATE          &Joy1, &Joy2;
  extern Image             &Cv;
  extern Own               &own1;
  extern Own               &own2;
  extern OwnBulletManage   &OBulManage;
  extern EnemyManage       &EneManage;
  extern EnemyBulletManage &EBulManage;
  extern MD5               &md5;
  extern Score             &score;

# endif

// 通常終了
void AppTermination();  // main.cpp
// 強制終了用
# define DefForceTermination { AppLogAdd("User Mes:  ForceTermination  FileName = %s , Line = %d\n",__FILE__,__LINE__ ); AppTermination(); }
// このマクロはDXLib.hが必要なので注意

# endif


Re: ヘッダの分割について

Posted: 2014年6月22日(日) 11:56
by h2so5
1.理由はコンパイルエラーに書いてあるはずです。
2.グローバル変数が多すぎです。

Re: ヘッダの分割について

Posted: 2014年6月22日(日) 12:26
by うずら
2について
 グローバル変数って全体で9個でも多いんですか?
 削ろうとすれば6,7個は削れるんですが、cppファイルでexternすることになるのでまとまってるほうが都合がいいと思ったのですが。

1について
現状のコード。変更部分のみ

コード:

// この二つは強制終了。

# ifndef __DXLIB
  namespace DXLib
  {
    int	AppLogAdd(const TCHAR *String, ...);						// ErrorLogFmtAdd と同じ機能の関数
  }
# endif

void AppTermination();  // main.cpp
# define DefForceTermination { AppLogAdd("User Mes:  ForceTermination  FileName = %s , Line = %d\n",__FILE__,__LINE__ ); AppTermination(); }
// このマクロはDXLib.hが必要なので注意
出てくるエラー

エラー 1 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
エラー 2 error C2143: 構文エラー : ',' が '*' の前にありません。

よくわからないので直接間違いを指摘していただけるとありがたいです

Re: ヘッダの分割について

Posted: 2014年6月22日(日) 14:13
by softya(ソフト屋)
C言語初心者に限定すれば多少グローバル変数が多くても仕方ないかと思います。
ちゃんとC++でオブジェクト指向したいなら避けたほうが良いと思います。

Re: ヘッダの分割について

Posted: 2014年6月22日(日) 16:18
by ISLe()
グローバル変数はひとつもないのが当たり前なのでグローバル変数ゼロを目指すのが良いと思います。

DXライブラリの関数定義を個別に抜き出すというのは本末転倒です。
DXライブラリに依存する処理と依存しない処理をソースファイル単位で分けるのが良いと思います。

Re: ヘッダの分割について

Posted: 2014年6月22日(日) 16:48
by うずら
みなさん回答ありがとうございました。

1,については、自作関数を使ってラップすることにします。


グローバル変数については、
h2so5 さんが書きました:グローバル変数が多すぎです。
ISLe() さんが書きました:グローバル変数はひとつもないのが当たり前なのでグローバル変数ゼロを目指すのが良いと思います。
このようなご指摘いただいたので、今後は必要な値だけ(今までグローバル変数から参照していたもの)を渡して動かす形にしようと思います。

ありがとうございました。

Re: ヘッダの分割について

Posted: 2014年6月22日(日) 18:31
by h2so5
2. のエラーですが、TCHARが定義されていないのが原因です。 tchar.h をインクルードしてください。

Re: ヘッダの分割について

Posted: 2014年6月22日(日) 23:46
by うずら
h2so5さん、ご指摘ありがとうございます。

そんな単純なことに気付けなかったとは・・・
不注意ですいませんでした。