#define

新規マクロを登録する

#define マクロ名 マクロ定義

解説

マクロ名で指定されたキーワードを指定された定義に置き換えられるようにプリプロセッサに登録をします。
#defineマクロは、あくまで個人がスクリプトを書きやすくカスタマイズしたい
場合に使うもので、初心者向きではありません。ここで説明した機能も、
頻繁に利用するものではありませんので、必要な場合にのみ参照してください。
#defineマクロは、基本的に置き換え文字列を登録します。

	例:
		#define hyouji mes
		hyouji "AAAAA..."
			↓(展開後)
		mes "AAAAA..."

#define#const命令の直後に「global」を入れることで、すべてのモジュールで
永続的に利用することのできるマクロを作成することができます。

	例:
		#module
		#define global test 0x1234
		#global
		a=test			; aに0x1234が代入される

通常は、モジュール内で#defineを定義した場合には、それ以外のモジュール
およびグローバルなエリアでは、同じ名前は認識されません。
global指定を入れることで、それ以降のすべての場所で定義した名前を
マクロで置き換えることができるようになります。

単純な置き換えマクロの他に、引数付きの展開が可能です。
引数は、マクロ名の後にカッコで囲んだ%1,%2,%3…の引数名で指定を
行ないます。
引数は必ず「%数値」で指定する必要があり、数値は1から順番に記述
してください。CやC++のプリプロセッサのようにシンボル名では指定
できないので注意してください。

	例:
		#define hyouji(%1) mes "prm="+%1
		hyouji "AAAAA..."
			↓(展開後)
		mes "prm="+"AAAAA..."

また、引数に初期(デフォルト)値を設定することが可能です。

	例:
		#define hyouji(%1="PRM=",%2=123) mes %1+%2
		hyouji "AAA",a
		hyouji "BBB"
		hyouji ,b
			↓(展開後)
		mes "AAA"+a
		mes "BBB"+123
		mes "PRM="+b

初期(デフォルト)値は、マクロを使用した時に省略された場合に
自動的に補完される値です。初期値を省略された場合は、補完されません。
マクロ引数の指定では#defineで指定する側では、カッコで囲んで
いますが、実際に使用する時にはカッコなしで指定してください。

		#define hyouji(%1) mes "prm="+%1
		hyouji("AAAAA...")

のような記述はエラーになるので注意してください。
ただし、ctypeオプションを使用することで以下のようなカッコ付き記述が
可能になります。

		#define ctype kansu(%1) %1*5+1
		a=kansu(5)

このオプションは、計算式など命令部分以外にマクロを使用したい時に
有効です。一見、C言語などの関数のように振舞いますが、実際にはマクロで
置き換えているだけなので、応用範囲は狭いので注意してください。
この記述方法は、本来のHSP文法とは異なるため自分のスタイルで記述したい
というカスタマイズ用途以外での利用は推奨していません。

マクロの展開時に特殊な動作を行なうキーワードを設定することが可能です。
この特殊キーワードは、主にことなるマクロ間でパラメータを共有したり、
入れ子構造をスタックによって実現するためのものです。

		#define start(%1) %tstart %s1 mes "START"
		#define owari %tstart mes %o

ここで指定されている「%s1」や「%o」などが特殊展開マクロです。
これを使ったサンプルは、以下のように展開されます。

		start "OK"    → mes "START"
		owari         → mes "OK"

このように、異なるマクロ間でデータを共有させることが可能になります。
特殊展開マクロは、以下の種類と機能があります。

	  マクロ      機能
	--------------------------------------------------------
		%t        タグ名を設定する
		%n        ユニークなラベル名を生成する
		%i        ユニークなラベル名を生成してスタックに積む
		%o        スタックに積まれた文字列を取り出す
		%p        スタックに積まれた文字列を取り出す(スタック維持)
		%s        引数パラメーターをスタックに積む
		%c        改行を行なう

特殊展開マクロは、「%」に続けて英文字1文字+パラメータで表現します。
以降のキーワードと識別するために、特殊展開マクロの後には半角スペースを
入れて下さい。「%tabc aaa」のようスペースを含む部分までが特殊展開マクロ
と判断されます。
特殊展開マクロでは、一般的なスタック(First In Last Out)を持っています。
このスタックは、同じタグ名を持つマクロで共有させることができます。
タグ名は、「%tタグ名」のように「%t」に続けて半角英文字16字以内で指定
します。先の例では「%tstart」と指定された「start」がタグ名にあたります。
「%s」は、引数パラメーターをスタックに積むための特殊展開マクロです。
「%s1」と指定すると、「%1」のパラメータをスタックに1段積みます。
スタックに積まれた文字列を取り出す場合は、「%o」を使用します。
「%o」は、スタックに積まれた文字列を取り出して展開します。スタックなので、
最後に積まれたものが最初に取り出されます。「%o0」と指定すると、
スタックを取り出しますが文字列の展開は行ないません(スタック取り出しのみ)。
スタックを戻さずに内容だけを取り出すのが「%p」です。「%p0」は、次に
取り出されるスタックの内容を展開します。「%p1」は、もう一段深いスタック
を取り出します。以降、「%p0」~「%p9」までを指定することが可能です。
ラベル生成の例を以下に示します。

		#define start %tstart *%i
		#define owari %tstart await 20:stick a:if a=0 : goto *%o

これを使ったサンプルは、以下のように展開されます。

		start  → *_start_0000
		owari  → await 20:stick a:if a=0 : goto *_start_0000

「%i」は、他と重ならないようなユニークなラベル名を生成してスタックに
1段積みます。「%i0」と指定するとラベル名をスタックに1段積みますが、
展開は行ないません。また、「%n」は、ユニークなラベル名を生成して展開
するだけで、スタックには積みません。
上の例では、ラベル名生成によってラベルを新しく作成して、ループ構造を
実現しています。この方法を使えば、入れ子になってもラベル名が重なる
ことのないループ構造を構築することができます。
また、1つのソーススクリプトファイル内ですべてのスタックが取り出されて
いなかったマクロ(タグ名)は、コンパイル時にエラーが報告されます。
かならず、すべてのスタックが取り出されて終わるようなマクロ命令の構成に
しておいてください。
HSP ver2.6で追加された標準定義マクロのwhilewenddountilfornext
は特殊展開マクロによって作られています。

関連項目

#constマクロ名の定数定義
#ifdefマクロ定義からコンパイル制御
#ifndefマクロ定義からコンパイル制御

サンプル逆引き (12)

demo.as
macro_new1.as
macros.as
module_test2.as
module_test3.as
module_test4.as
test_libload2.as
test_libload3.as
test_libload4.as
test_libload5.as
test_libload6.as
test_libload7.as

情報

バージョン2.61
作成日2004/03/01
著作者onitama
URLhttp://www.onionsoft.net/
備考ver2.61標準命令
タイプ内蔵命令
グループプリプロセッサ命令
hs ファイルhsphelp\i_prep.HS