如何定义与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"以外的其他名称时,它会按预期工作,这让我相信它在重复评估自己。

如果是,如何定义只计算一次的宏?否则,我应该研究什么来解决这个问题?

EDIT我找到了解决这个问题的方法,处理了两次,一次将if转换为_if,另一次将_if转换为if(。我认为有更好的方法可以做到这一点,所以在我看来这只是一个临时解决方案。

您需要防止m4尝试重新扩展替换项。通过双重报价:

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

最新更新