ヘッダの分割について

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

ヘッダの分割について

#1

投稿記事 by うずら » 10年前

こんにちは。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


アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#2

投稿記事 by h2so5 » 10年前

1.理由はコンパイルエラーに書いてあるはずです。
2.グローバル変数が多すぎです。

うずら

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

#3

投稿記事 by うずら » 10年前

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: 構文エラー : ',' が '*' の前にありません。

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

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

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

#4

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

C言語初心者に限定すれば多少グローバル変数が多くても仕方ないかと思います。
ちゃんとC++でオブジェクト指向したいなら避けたほうが良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe()

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

#5

投稿記事 by ISLe() » 10年前

グローバル変数はひとつもないのが当たり前なのでグローバル変数ゼロを目指すのが良いと思います。

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

うずら

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

#6

投稿記事 by うずら » 10年前

みなさん回答ありがとうございました。

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


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

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#7

投稿記事 by h2so5 » 10年前

2. のエラーですが、TCHARが定義されていないのが原因です。 tchar.h をインクルードしてください。

うずら

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

#8

投稿記事 by うずら » 10年前

h2so5さん、ご指摘ありがとうございます。

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

閉鎖

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