返答ありがとうございます。
色々調べた結果、どうやら#ifdefやexternではなく、ヘッダファイルの扱いが分かっていない気がします。
そのため引き続き質問させてください。
作った下記 maincpp、GV.h、function.hの3つのファイルをコンパイル→リンクすることを想定したとき
『main.cppファイル』
コード:
#define GLOBAL_INSTANCE
#include "../include/GV.h"
/* ループで必ず行う3大処理 関数 */
int ProcessLoop(){
if(ProcessMessage()!=0) return -1; //プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0) return -1; //画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2(); //現在のキー入力処理を行う
return 0;
}
/* WinMain関数 */
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1; //初期化と裏画面化
load(); //データロード
/* このwhile文内でメイン動作 */
while(ProcessLoop()==0){
graph_main(); //描画メイン
if(CheckStateKey(KEY_INPUT_ESCAPE)==1) break; //エスケープが入力されたらブレイク
ScreenFlip(); //裏画面反映
}
DxLib_End(); //DXライブラリ終了処理
return 0;
}
『GV.hファイル』
コード:
#include "../../../include/DxLib.h"
#include "define.h"
#ifdef GLOBAL_INSTANCE
#define GLOBAL //GLOBAL_INSTANCEが定義されていたらGLOBALを空白に変換
#else
#define GLOBAL extern //GLOBAL_INSTANCEが定義されていない場合、GLOBALをexternに変換
#endif
#include "function.h" //関数宣言
//画像用変数宣言部
GLOBAL int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)
//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言
function.h
コード:
//graph.cpp
//描画メイン
GLOBAL void graph_main();
//key.cpp
//現在のキー入力処理を行う
GLOBAL int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
GLOBAL int CheckStateKey(unsigned char Handle);
//load.cpp
//データのロード
GLOBAL void load();
まず、main.cppの2行目にある#include "../include/GV.h"を呼び出して展開する。
『main.cppファイル』
コード:
#define GLOBAL_INSTANCE
#include "../../../include/DxLib.h"
#include "define.h"
#ifdef GLOBAL_INSTANCE
#define GLOBAL //GLOBAL_INSTANCEが定義されていたらGLOBALを空白に変換
#else
#define GLOBAL extern //GLOBAL_INSTANCEが定義されていない場合、GLOBALをexternに変換
#endif
#include "function.h" //関数宣言
//画像用変数宣言部
GLOBAL int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)
//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言
/* ループで必ず行う3大処理 関数 */
int ProcessLoop(){
if(ProcessMessage()!=0) return -1; //プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0) return -1; //画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2(); //現在のキー入力処理を行う
return 0;
}
---以下略---
ここでmain.cppに『#include "function.h" //関数宣言』という記述があるので、
function.hをmain.cppに呼び出す。
『main.cppファイル』
コード:
#define GLOBAL_INSTANCE
#include "../../../include/DxLib.h"
#include "define.h"
#ifdef GLOBAL_INSTANCE
#define GLOBAL //GLOBAL_INSTANCEが定義されていたらGLOBALを空白に変換
#else
#define GLOBAL extern //GLOBAL_INSTANCEが定義されていない場合、GLOBALをexternに変換
#endif
//graph.cpp
//描画メイン
GLOBAL void graph_main();
//key.cpp
//現在のキー入力処理を行う
GLOBAL int GetHitKeyStateAll_2();
//受け取ったキー番号の現在の入力状態を返す
GLOBAL int CheckStateKey(unsigned char Handle);
//load.cpp
//データのロード
GLOBAL void load();
//画像用変数宣言部
GLOBAL int img_ch[2][12]; //キャラクタ画像9枚分 X2(変身用)
//構造体変数宣言部
GLOBAL ch_t ch; //キャラクタデータ宣言
/* ループで必ず行う3大処理 関数 */
int ProcessLoop(){
if(ProcessMessage()!=0) return -1; //プロセス処理がエラーなら-1を返す
if(ClearDrawScreen()!=0) return -1; //画面クリア処理がエラーなら-1を返す
GetHitKeyStateAll_2(); //現在のキー入力処理を行う
return 0;
}
---以下略---
次に以下の記述を実行する
コード:
#ifdef GLOBAL_INSTANCE
#define GLOBAL //GLOBAL_INSTANCEが定義されていたらGLOBALを空白に変換
#else
#define GLOBAL extern //GLOBAL_INSTANCEが定義されていない場合、GLOBALをexternに変換
#endif
*補足:#include "define.h"は、GLOBALの記述がないファイルなので省略
このときに、main.cppの1行目に、『#define GLOBAL_INSTANCE 』という記述があるため、
GLOBALは、全て空白になってしまうのではないのでしょうか?
「龍神録プログラミングの館」の第4章までは、外部ファイルに記述されている関数を使用するために、
外部関数をmain.cppに呼び出す際に、externを記述するのは分かっていたのですが。
第5章でヘッダファイルの登場で上記の解釈になったしまい、どう展開されているのかがいまいち理解出来ない次第です。
申し訳ありませんが、どの認識が間違っているのかご指摘いただきますようお願いします。