#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は特殊展開マクロによって作られています。

特殊な場面において、「%c」によって改行を挟んで展開することが可能です。
「%c」の部分で行が分割されて展開されます。主に複数のプリプロセス文に
展開されるようなマクロを定義する用途などに使用することができます。
ただし、現状ですべてのプリプロセッサがマクロ展開に対応しているわけでは
ありません。多用しすぎると、かえって見難くなることもありますので、
よくご理解の上お使いください。

例 :
	#define def(%1,%2) #deffunc %1@ %c mes@hsp %2@
	def test,a
	return
	def test2,a
	return

関連項目

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

サンプル逆引き (8)

comtest1.hsp
comtest3.hsp
comtest7.hsp
demo.hsp
dragdrop.hsp
macro.hsp
shoot.hsp
winmove.hsp

情報

バージョン3.0
作成日2004/10/12
著作者onitama
URLhttp://www.onionsoft.net/
備考ver3.0標準命令
タイプ内蔵命令
グループプリプロセッサ命令
hs ファイルhsphelp\i_prep.hs