如何定义与m4中的扩展同名的宏?

时间:2013-02-04 21:35:32

标签: recursion macros m4

我试图用if替换if(使用GNU m4 1.4.14并且我收到ERROR: end of file in argument list 在尝试时:

define(`if', `if(')
define(`then', `){')
define(`fi', `}')

if foo then bar() fi

我已经尝试转义括号,但是在短暂的一段时间后,它会导致m4出现错误。通过手册扫描,我发现与此问题无关。

将宏的名称更改为“IF”或“if”之外的其他内容时,它会按预期工作,这使我相信它会反复评估自己。

如果是这样,我如何定义仅评估一次的宏?否则,我应该考虑解决这个问题?

编辑我通过处理两次找到了解决此问题的方法,一次将if转换为_IF,然后将_IF转换为if(。我认为有更好的方法可以做到这一点,所以这只是我眼中的临时解决方案。

1 个答案:

答案 0 :(得分:3)

您需要阻止m4尝试重新展开替换。通过双引号来实现:

define(`if', ``if('')
define(`then', `){')
define(`fi', `}')

if foo then bar() fi