より一般的な解決方法は、define() の引数を引用符で囲んでその引数の展開を遅らせる方法です。左と右の単一引用符に囲まれたテキストは、すぐには展開されず、引数が収集されたときに引用符が取り除かれます。引用符で囲まれた文字列の値は、その引用符を取り除いた文字列です。
したがって、以下の例では、M は 100 ではなく文字列 N として定義されます。
define(N, 100) define(M, `N')
一般的なルールとして、m4 は評価時に 1 組の単一引用符を取り除きます。これは、マクロの外でも同じです。ワード define を出力に表示する場合には、入力ではそのワードを引用符で囲む必要があります。
`define' = 1;
通常は、マクロの引数を引用符で囲んで、マクロに定義した値が実際にそのマクロに割り当てられるようにする方法をお勧めします。たとえば、N を再定義するには、以下のように引用符を使用してその評価を遅らせます。
define(N, 100) ... define(`N', 200)
引用符で囲まない場合は、2 番目の定義の N はすぐに 100 に置換されます。
define(N, 100) ... define(N, 200)
このため結果は以下の定義と同じになります。
define(100, 200)
m4 は、名前と判断できるものしか定義できないので、この文を無視します。
左と右の単一引用符以外を引用符記号として使用したい場合には、以下のように組み込みマクロ changequote() を使用して、引用符記号を変更することができます。
changequote([, ])
この例では、マクロによって引用符記号を左と右の単一引用符から左と右の角括弧に変更します。引用符記号の最大文字長は 5 文字です。元の引用符記号に戻すには、引数のない changequote() を使用します。
changequote
undefine() は、マクロまたは組み込みマクロの定義を削除します。
undefine(`N')
この例では、マクロによって N の定義が削除されます。undefine() の引数は必ず引用符で囲んでください。同様に、組み込みマクロも undefine() を使用して削除できます。
undefine(`define')
組み込みマクロを削除したり再定義すると、そのマクロの元の定義は使用できなくなります。マクロの名前は、defn() を使用して変更することができます。たとえば、組み込みマクロの define() を XYZ() という名前に変更する場合には、以下のように指定します。
define(XYZ, defn(`define')) undefine(`define')
この指定を行うと、XYZ() は define() の元の意味を引き継ぎます。したがって、以下のマクロは A を 100 として定義します。
XYZ(A, 100)
組み込みマクロの ifdef() は、マクロが現在定義されているかどうかを判定することができます。以下のようにして、システムごとに特定のマシンに適した定義を行うことができます。
ifdef(`pdp11', `define(wordsize,16)') ifdef(`u3b', `define(wordsize,32)')
ifdef() マクロには、3 つの引数を指定できます。最初の引数が定義されている場合は、ifdef() の値は 2 番目の引数になります。最初の引数が定義されていない場合は、ifdef() の値は 3 番目の引数になります。
ifdef(`unix', on UNIX, not on UNIX)