条件 compilation/interpretation 使用 m4

Conditional compilation/interpretation using m4

我想使用 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 本身不起作用:"It will choke on input which does not obey C's lexical rules." 似乎 gpp 具有开箱即用的功能,因此使用它可能更有意义,但是如果让 m4 这样做不是太痛苦的话,我更喜欢 m4 的无处不在。)

我也在找这个,最后自己写了一个。这是我 wiki 上代码的 link:

http://www.eugeneweb.com/wiki/Sites/M4Macros

我定义了没有# 的名称,例如。 IF, ELSE, ENDIF, 等等... M4 还需要括号来保存 CPP(大部分)不需要的参数。我还添加了选择性调用以保护具有副作用的宏免于在未选择的块中调用。 再见。