プリプロセッサ(後半)
後半としてPACKFILEまわりのプリプロセッサから説明いたします。
自作ソフトのバージョンアップ時に再コンパイルをするわけですが、
連続してPACKFILEを作成することがある時など一個一個PACKFILE指定するのが意外と面倒です。

2.6からPACKFILEに入れる物をそれぞれのソースに記述することができるようになりました。
#packがPACKFILEに追加することができる命令で「#pack "filename"」という書式となっています。
「start.ax」はEXE作成時PACKFILEに自動追加になったようですのでココで指定する必要はありません。
入れても重複ファイルは無視されるようですので問題ありませんが…。
追加するファイルの指定は通常通り、絶対パス指定でも相対パス指定でもどちらでも構いません。
#pack "c:\\Program Files\\hsp\\sample.bmp"
#pack "test.wav" ; curdirが「c:\Program Files\hsp\」の時、「sample.bmp」と同じディレクトリを指す

	stop
指定したファイルで作成する場合は今までの「EXEファイル作成」方法と異なりますので注意してください。 2.6から追加された「HSP(P)」メニューにある「実行ファイル自動作成(A)ctrl+F9」になります。 このパックの仕方では暗号化はされません。 暗号化したい場合は#epackをご利用ください。 #packの暗号化版というだけで書式は全く同じ「#epack "filename"」です。
#epack "enclosure.txt"

	stop
これら自動作成をすると元々置いてあったPACKFILEは上書きされファイル情報は消えてしまいます。 パックするファイル指定以外に#packoptで自動作成オプションまでできるんですね。 指定できるもの、p1に書くもの、p2に書くもの、は下記の通りです。
内容パラメータ1パラメータ2
EXE名称name"hsptmp"
ランタイムruntime"hsprt"
作成タイプtype0
初期Xサイズxsize640
初期Yサイズysize480
初期非表示hide0
ヘルプの書式では「#packopt p1,p2」とありますが、「#packopt p1 p2」の間違いのようです。 ヘルプの書式ではエラーとなってしまうのでパラメータ間はスペースで間違いないでしょう。 上記表のパラメータ2は初期値です。 作成タイプは0で通常EXE、1でフルスクリーンEXE、2でスクリーンセーバとなっています。 初期非表示は0で表示、1で非表示、です。
#packopt name "hspbctest"
#packopt xsize 320
#packopt ysize 240

	font "MS 明朝", 15
	pos winx - 135 / 2, winy - 15 /2 : mes "入門講座29章テスト"
	stop
PACKFILEのプリプロセッサはこれくらいにして、登録済み名称の取り消しをする#undefを紹介します。 上で書いたように既に登録されているマクロや命令をキャンセルするプリプロセッサです。 #undefの実行する時点で取り消されるので上から流れて来て#undefまでならマクロが普通に使用できます。 該当マクロが存在しなくてもエラーになりませんが、書式は「#undef マクロ名」です。
#define TEST 10
	mes TEST
#undef TEST
	mes TEST ; 既に存在しないので変数になる
	stop
続いてコンパイル制御をするプリプロセッサの解説に入りましょうか。 まずは#ifと一緒に#else#endifの説明をしましょう。 2.55にもif,elseというものが存在しましたね? 名前だけでなく処理もほとんど同じで条件判断命令ですが、制御する対象が違いコンパイル制御となります。 書式は「#if 数値式」です。#else,#endifにはパラメータがありません。 #ifから#endifまでが効果範囲です。 通常のif,else同様、偽の時にさせる処理がない場合#elseを入れなくても構いませんが 必ず終端に#endifを付け忘れないようにしてください。 #endifは付け忘れて条件に一致しない場合、コンパイル制御命令以降全処理がコンパイルされません。
#define VERSION 100
#if VERSION > 150
	mes "新ファイルです"
#else
	mes "旧ファイルです"
#endif

	stop
この#ifで使えるパラメータは数値式だけです。 変数を条件式に入れることはできません。 #ifと似たようなもので#ifdef#ifndefというものがあります。 これらもコンパイル制御の命令ですが、数値ではなくマクロ定義されているか否かで出力されます。 書式はそれぞれ「#ifdef マクロ名」「#ifndef マクロ名」です。 #ifdefはマクロが定義されている時、#ifndefは定義されていない時が真となり出力ONとなります。 上記命令にも#elseが使えて、#endifは必ずつけなければなりません。 これらの命令は全てプリプロセッサ(コンパイル前にスクリプトに対して行う前処理)ですので #ifdef,#ifndefの記述より後に定義していても定義されていると見做されます。
#ifdef a ; マクロaは定義されているか
	dialog "定義されていません"
	end
#endif
#define A "マクロA" mes A stop
これらのプリプロセッサはネスティングに対応していますので入れ子にすることができます。 ヘルプにはネストの深さの限界が書いていないようですが試したところ32重まで行けました。 普通にしていれば33重以上になることはまずないので心配はないと思いますが…。 プリプロセッサは以上で終了です。 次章から通常命令に入っていきたいと思います。