首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用m4进行预处理

利用m4进行预处理
EN

Stack Overflow用户
提问于 2015-03-11 05:01:37
回答 1查看 1.3K关注 0票数 2

我正在使用m4为免费Pascal(课程作业)编写一个预处理器.我在堆栈溢出这里上读取线程,从那里读取到一个博客,它实质上显示了m4用于C预处理的基本用法。博主使用一个测试C文件test.c.m4,如下所示:

代码语言:javascript
复制
#include 

define(`DEF', `3')

int main(int argc, char *argv[]) {
        printf("%d\n", DEF);
        return 0;
}

并使用C生成这样的处理过的m4文件,这很好。

代码语言:javascript
复制
$ m4 test.c.m4 > test.c
$ cat test.c
#include <stdio.h>



int main(int argc, char *argv[]) {
    printf("%dn", 3);
    return 0;
}

我的怀疑是:

  1. 程序员将编写代码,其中行
代码语言:javascript
复制
    define(`DEF', `3')

将会是

代码语言:javascript
复制
    #define DEF 3

那么,谁将这一行转换为上面的一行呢?我们可以使用像sedawk这样的工具来做同样的事情,但是m4的使用是什么呢?m4所做的事情也可以使用sed来实现。

如果有人能告诉我如何将程序员的代码转换成m4可以使用的文件,那将是非常有帮助的。

  1. 我在使用m4时遇到了另一个问题。像C这样的语言中的注释在预处理之前会被删除,所以这可以用m4来完成吗?为此,我在m4中寻找命令,通过这些命令可以使用regex替换注释,并找到regexp(),但它要求将字符串替换为参数,在本例中是不可用的。那么,如何实现这一点呢?

抱歉,如果这是个天真的问题。我阅读了m4的文档,但没有找到解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-27 00:52:29

  1. 在这种情况下,m4是将DEF转换为3的工具。的确,sedawk在这个简单的情况下可以达到同样的目的,但是m4是一个更强大的工具,因为它( a)允许宏参数化,b)包含条件,c)允许通过输入文件重新定义宏,等等。例如,您可以编写(在for.pas.m4文件中,受棘轮启发):

定义(1,10)LOOP',循环(I,10) WriteLn(i);

..。,它为m4 for.pas.m4处理Pascal编译器生成以下输出:

代码语言:javascript
复制
for i := 1 to 10 do
begin
        WriteLn(i);
end;
  1. 使用m4删除一般Pascal注释是不可能的,但是创建一个宏来包含在处理过程中将被‘m4’删除的注释是很简单的:

定义(NOTE',dnl)dnl注(‘这是一个注释’)x := 3;

..。生产:

代码语言:javascript
复制
    x := 3;

要由m4展开的常用宏可以放在一个公共文件中,该文件可以包含在使用它们的任何Pascal文件的开头,因此没有必要在每个Pascal文件中定义所有必需的宏。参见include (file)中的m4手册

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28978906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档