6.条件、循环、递归

6.1 检测一个宏是否被定义

m4中存在两个不同的内置条件。第一个是ifdef,第二个是ifelse

ifdef (name, string-1, [string-2])

如果name被定义为了宏,那么扩展到string-1,否则到string-2。如果string-2没有,那么为空字符串。

ifdef(`foo', ``foo' is defined', ``foo' is not defined')
⇒foo is not defined
define(`foo', `')

ifdef(`foo', ``foo' is defined', ``foo' is not defined')
⇒foo is defined
ifdef(`no_such_macro', `yes', `no', `extra argument')
error→m4:stdin:4: Warning: excess arguments to builtin `ifdef' ignored
⇒no

6.2 if-else 结构,多分支

ifelse (comment)

ifelse (string-1, string-2, equal, [not-equal])

ifelse (string-1, string-2, equal-1, string-3, string-4, equal-2, …, [not-equal])

  • 传入一个参数:将忽略参数且没有任何输出。
  • 三个或四个参数:string-1==string-2ifelse扩展到equal;否则到not-equal。最后的第五个参数会被忽略。
  • 传入六个或更多参数:string-1==string-2ifelse扩展到equal-1;否则前三个参数被忽略,重新计算。

1个参数的情况可以代替dnl作为注释来使用:

ifelse(`some comments')

3~4个参数:

ifelse(`foo', `bar', `true')

ifelse(`foo', `foo', `true')
⇒true
define(`foo', `bar')

ifelse(foo, `bar', `true', `false')
⇒true
ifelse(foo, `foo', `true', `false')
⇒false