#define

新規マクロを登録する

#define マクロ名 マクロ定義

解説

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

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

#define命令の直後に「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マクロ定義からコンパイル制御2

サンプル逆引き (61)

01_int64.hsp
02_dim64.hsp
03_qpeek、qpoke.hsp
04_varptr64.hsp
05_dupptr64.hsp
06_libptr64.hsp
10_float.hsp
11_fdim.hsp
12_floatとfloatintの違い.hsp
20_strw.hsp
21_swdim.hsp
22_strwlen.hsp
23_strwrep.hsp
24_instrw.hsp
25_strwupper.hsp
26_strwlower.hsp
27_strwinsert.hsp
28_strwmid.hsp
29_strwtrim.hsp
30_strwcomp.hsp
31_L(),_T() マクロ.hsp
32_UTF-16文字列操作時注意点.hsp
40_callfunc64系.hsp
41_cfunc64系.hsp
42_引数が構造体の値渡しの場合.hsp
43_戻り値が構造体の値渡しの場合.hsp
appconfig.hsp
comtest1.hsp
comtest3.hsp
comtest7.hsp
d3m.hsp
d3m_techdemo.hsp
demo.hsp
dragdrop.hsp
hsplogo.hsp
macro.hsp
menusample.hsp
multimon.hsp
multitouch1.hsp
multitouch2.hsp
multitouch3.hsp
pronama3.hsp
pronama4.hsp
pronama5.hsp
sample21.hsp
sample_03_basic.hsp
sample_09_imagetest.hsp
SampleDiskInfo.hsp
sendmail.hsp
shoot.hsp
tamane2.hsp
tamane4.hsp
volsamp.hsp
vtest1.hsp
vtest2.hsp
web.hsp
winmove.hsp
xsample_alphapaint.hsp
xsample_alphastg.hsp
xsample_amano.hsp
xsample_Astro.hsp

情報

バージョン3.5
作成日2017/09/13
著作者onitama
URLhttp://hsp.tv/
備考ver3.5標準命令
タイプ内蔵命令
グループプリプロセッサ命令
対応環境
  • Windows 版 HSP
  • コマンドライン版 HSP
  • HSPLet
hs ファイルhsphelp\i_prep.hs