4.1. 外部过滤器

无论你的汇编器提供何种宏支持,或者你使用何种语言(甚至是 C!),如果该语言对你来说不够富有表现力,你可以通过一个 Makefile 规则将文件传递给外部过滤器,就像这样

%.s:    %.S other_dependencies
        $(FILTER) $(FILTER_OPTIONS) < $< > $@

4.1.1. CPP

CPP 确实不是很富有表现力,但对于简单的任务来说已经足够了,它是标准,并且可以被 GCC 透明地调用。

作为其局限性的一个例子,你不能声明对象以便析构函数在声明块的末尾自动调用;你没有转向或作用域等等。

CPP 随任何 C 编译器一起提供。然而,考虑到它的平庸之处,如果有可能不使用 C 就能完成任务,请远离它。

4.1.2. M4

M4 为你提供了宏处理的全部能力,它具有图灵等价的语言、递归、正则表达式等等。你可以用它做任何 CPP 做不到的事情。

可以将 macro4th (this4th) 作为使用 m4 进行高级宏编程的示例。

然而,其功能失调的引用和取消引用语义迫使你使用显式的续传式尾递归宏风格,如果你想进行高级宏编程(这让人想起 TeX -- 顺便说一句,有人尝试将 TeX 用作排版以外的任何宏处理器吗?)。这并不比根本不允许引用和递归的 CPP 更糟糕。

要获取的正确 M4 版本是GNU m4它具有最多的功能,并且是所有版本中错误或限制最少的。m4 被设计为对于最简单的用途之外的任何操作都很慢,这对于大多数汇编编程来说可能仍然可以接受(你不会在编写百万行汇编程序,对吧?)。

4.1.3. 使用你自己的过滤器进行宏处理

你可以使用常用工具(如 perl、awk、sed 等)编写你自己的简单宏展开过滤器。它可以相当快速地完成,并且你控制一切。但是,当然,宏处理中的强大功能意味着“艰难的方式”。