首页 > 解决方案 > 使用 m4 进行条件编译/解释

问题描述

我想m4用作缺乏此功能的几种不同脚本语言的预处理器。

特别是,我需要模拟cpp条件代码包含的 C 预处理器 ( ) 功能:

#if something

some
long
code
block

#else

alternate
code
block

#if something-else

do
more
stuff

#endif

#endif

m4ifelse()并不特别适合长代码块,所以我似乎基本上需要编写 m4 宏来模拟这一点,通过测试条件,然后根据需要使用divert来包含或排除块。

棘手的部分将是跟踪嵌套级别;据我所知,我必须在 m4 中实现自己的堆栈才能做到这一点。这在概念上似乎很简单,而且我确信通过一两天的黑客攻击,我可以拥有一个工作系统。

但这感觉就像在重新发明轮子——我肯定不能成为第一个有这种需求的人。现有的、经过测试的、强大的解决方案肯定比我作为 m4 级别的初学者可以一起破解的任何解决方案都要好。

有没有常见的 m4 习语?是否有现有的开源 m4 代码来执行此操作?在搜索引擎中四处寻找并没有发现任何有用的东西。

(由于 cpp 自己的文档中给出的原因,使用 cpp 本身不起作用:“它会阻塞不遵守 C 的词法规则的输入。” 似乎gpp具有开箱即用的功能,因此使用它可能更有意义,但如果让 m4 这样做不太痛苦,我更喜欢 m4 的普遍性。)

标签: preprocessorm4

解决方案


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

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

我定义了没有# 的名称,例如。IF、ELSE、ENDIF 等... M4 还需要括号来保存 CPP(大多数情况下)没有的参数。我还添加了一个选择性调用来保护具有副作用的宏在未选择的块中被调用。再见。


推荐阅读