我想使用m4
作为缺少此功能的几种不同脚本语言的预处理器。
特别是,我需要模拟条件代码包含的C预处理器(cpp
)功能:
#if something
some
long
code
block
#else
alternate
code
block
#if something-else
do
more
stuff
#endif
#endif
m4的ifelse()
并不特别适用于长代码块,所以看起来我基本上需要编写m4宏来模拟这个,通过测试条件然后使用divert
来包含或排除块酌情。
棘手的部分将是跟踪嵌套水平;据我所知,我必须在m4内实现我自己的堆栈才能做到这一点。这似乎在概念上是直截了当的,我确信在一两天的黑客行为中我可以拥有一个工作系统。
但感觉就像重新发明轮子一样 - 我肯定不能成为第一个有这种需求的人。现有的,经过测试的,强大的解决方案肯定比我作为一名m4级初学者能够解决的问题更好。
这有共同的m4习语吗?是否有现成的开源m4代码?在搜索引擎中浏览并没有发现任何有用的东西。
(使用cpp本身不会出于cpp自己的文档中给出的原因:“它会阻塞不符合C的词法规则的输入。”似乎gpp具有开箱即用的功能,所以使用它可能更有意义,但我更喜欢m4的普遍性,如果让m4做到这一点并不太痛苦。)
答案 0 :(得分:1)
我也在找这个,最后自己写了一个。这是我维基上代码的链接:
http://www.eugeneweb.com/wiki/Sites/M4Macros
我定义了不带# 的名称,例如。 IF、ELSE、ENDIF 等...此外,M4 需要括号来保存 CPP(大多数)不需要的参数。我还添加了一个选择性调用来保护具有副作用的宏免受未选择块中的调用。 巧。