トピックパス

  1. トップ
  2. コンテンツ
  3. プログラミング
  4. HSP
  5. 中級者への道、プリプロセッサ命令其ノ一

中級者への道、プリプロセッサ命令其ノ一

プリプロセッサ命令とはスクリプトをコンパイルする前に処理する命令のことである。これを使えるようにならないと初級者からの脱却は難しい。【#】から始まるのがプリプロセッサ命令である。

#define

#defineとは、あるものをあるものに置き換えることができる命令である。


#define 王様役 "おれさま" ; #define A B の場合、AはBに置き換わる。

    mes 王様役

上のスクリプトを実行すると

おれさま

となるのだが、#defineとはあらかじめ指定したものを定義しておくと、展開時に置き換わる。この場合、王様役"おれさま"になるのである。よって、


    mes "おれさま"

と全く同じ物になるのだが。気をつけて欲しいのは、


    王様役 = "おれさま"

    mes 王様役

とは全くの別物であるということだ。例えて言うと、変数を使用している方は、本番中に王様役おれさまに決まったのであって、#defineを使用している方は、本番前に王様役おれさまに決まっていた。と言う感じだ。試しに上記3つのスクリプトからAXファイルを作成してサイズを調べるとわかるであろう。三つ目は違うが、一つ目と二つ目はサイズも同じならAXファイルそのものも全く同じなのである。分かりにくいかもしれないが、三つ目のAXファイルには他の二つには無い、王様役おれさまに決まる過程が書かれている。

上記では王様役のように日本語を使用し、実際このまま起動してもエラーにはならないが、必ず半角大文字アルファベットアンダーバーを使ってくれたまえ。


#define NEKO_X (20 + 10)
#define NEKO_Y 20 + 10
#define NEKO "ネコ"

    pos NEKO_X * 2, NEKO_Y * 2
    mes NEKO

この場合は、posのパラメータにある【NEKO_X * 2】は【(20 + 10) * 2】に、【NEKO_Y * 2】は【20 + 10 * 2】に置き換わって、


    pos (20+10) * 2, 20+10 * 2
    mes NEKO

となり、第一パラメータには60、第二パラメータは40になってしまい、()の有る無しでは結果が変わる事に注意して欲しい。

また、おすすめは出来ないが、


#define AO_NEKO color 0x00, 0x00, 0xFF : mes "ネコ"

    AO_NEKO

この場合のように、やろうと思えばコマンドを、それも複数のコマンドを一つの#defineで置き換えられてしまうし、


#define AO_NEKO\
    color 0x00, 0x00, 0xFF:\
    mes "ネコ"

    AO_NEKO

のように【¥】(【\】になっている場合【¥】と同義)を使えば複数行に渡って記述する事も出来る。ちなみに、コマンドコマンドの間に【:】を付けるのを忘れないように。他にも使い方があるのだが、それは別の機会に。

スクリプトの最初にでも#defineで定義しておけば、それを何ヶ所で使おうが、修正する時は1ヶ所で済み、コーディングが楽になる。ただし、コマンドを置き換えるのはおすすめしない。置き換えるのは文字列のみにするべきである。数値の置き換えもしてみたが、これもおすすめはしない。なぜかは次に。

#const

#defineで数値は扱うべきではないという話をしたが、なぜならその場合#constを使うべきだからである。

#constとは定数を定義するものであり、置き換わるという面では同じだが、#defineとは少し違う。


#const HIDARI_X 5 ; 左位置x
#const HABA 20    ; 幅

#define DEFINE_MIGI_X (HIDARI_X + HABA - 1) ; 右位置x
#const   CONST_MIGI_X (HIDARI_X + HABA - 1) ; 右位置x

HIDARI_XHABA#defineを使い定義しても結果は同じだ。しかし、DEFINE_MIGI_X(5 + 20 - 1)となるのだが、DEFINE_MIGI_X24となる。つまり、計算後の値に置き換わるのである。

よって、コンパイル前に計算する以上、数値を定義する場合は#constを使い、また、文字列を定義する場合は#defineというように使い分けることが好ましいであろう。

最終更新日
2011-07-19