5

我试图用 if( 使用 GNU m4 1.4.14 替换 if 并且我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(。我认为有更好的方法可以做到这一点,所以这只是我眼中的临时解决方案。

4

1 回答 1

4

您需要防止m4尝试重新扩展替换。通过双引号来做到这一点:

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

if foo then bar() fi
于 2013-03-01T00:32:03.923 回答