文档章节

GNU M4 笔记

R
 ReJaVu
发布于 2013/12/15 09:14
字数 892
阅读 2689
收藏 8
点赞 1
评论 1

认识 GNU M4

m4 是个宏处理器,像 C 语言的宏一样,用来替换文本。

在终端上输入 m4 [文件名] ,这时候 m4 读取文件,然后输出结果。 如果不指定文件名,就将标准输入作为指令。

为了方便演示,在代码块里面,没有“=>”的是输入,有“=>”的是输出。现在打开 m4,输入

	hello world
	=>hello world

在这里输出的结果和输入一样。接着我们定义宏 hello,

	define(`hello',`hi')
	=>
	hello world
	=>hi world

可见 hello 已经被替换成 hi 了。define 是 m4 的内置宏,它用来定义一个宏。 这里将 hello 定义成 hi,在输入 hello world 的时候就进行了宏调用。 如果想阻止调用,可以使用引用(quoting):

	define(`hello',`hi')
	=>
	`hello' world
	=>hello world
	``hello'' world
	=>`hello' world

使用一对“`'”将字符引用之后 m4 就不会试图对它进行替换,仅仅看作是字符串。 空的引用“`'”表现出来的是 null string。顾名思义,null string 不包含任何字符。

m4 将 null string、空格、新行和其它一些特殊符号(除了下划线“_”、左括号“(”、“ ` ”字符)之间的词分割成 token。默认地,m4 原封不动地输出字符串(以“`'”括起)、特殊字符和注释,并试图查找该 token 是否是定义过的宏,如果没有定义过就照样输出,否则进行宏展开。所以,

	hello world
	=>hello world <-- “hello”和“world”都没定义过,按原来输出
	define(`hello',`hi') <-- 定义宏 hello
	=>
	hello world
	=>hi world <-- hello 已定义,展开
	helloworld
	=>helloworld <-- helloworld 未定义,按原来输出
	hello`'world
	=>hiworld <-- 空字符串“`'” 类似空格可以分割 token,注意这里两个词之间没空格
	he`'llo
	=>hello <-- he  和 llo 未定义,按原来输出,null string 不占空间
	`hello' world
	=>hello world <-- 引用为字符串,不展开

m4 展开一个宏之后,还会再检查展开后的输出是宏与否,并反复如此:

	define(`hello',`hi')
	=>
	define(`hi',`你好')
	hello world
	=>你好 world

一个死循环 :)

	define(`hello',`this is hello')
	hello world

接着来看 define 这个内置宏,

	define(`hello',`hi')
	=>

在这里调用了 define,紧随其后在括号里用逗号分开是给它的两个参数。第一个参数是宏名,第二个是展开体。 默认地,define 宏输出一个新行,如果想要删除一个新行,可以在 define 后面添加 dnl 宏,dnl 表示 delete new line,也是一个内置宏。

自定义的宏可以使用$1,$2 ... $n 引用参数:

	define(`echo',`$1 $2')
	=>
	echo(para1)
	=>para1 
	echo(para1,para2)
	=>para1 para2

对宏的参数使用引用(quote)可以控制是否展开参数。来看 GNU M4 官方手册上的一个例子:

	define(`active', `ACT, IVE')
	=>
	define(`show', `$1 $1')
	=>
	show(active)
	=>ACT ACT
	show(`active')
	=>ACT, IVE ACT, IVE
	show(``active'')
	=>active active

根据手册上的说法,当宏的参数没有引用一层的时候,在宏展开前先尝试展开参数;引用一层时,在宏展开之后展开参数;引用两层时不展开。

结合上面的例子,

	define(`active', `ACT, IVE')
	=>
	define(`show', `$1 $1')
	=>
	show(active) --> show(ACT,IVE)
	=>ACT ACT
	show(`active') --> active active
	=>ACT, IVE ACT, IVE
	show(``active'') --> `active' `active'
	=>active active

另外我发现,对于 define 宏的第一个参数如果不加引用会:

	define(a,`b')
	=>
	a
	=>b
	define(a,`c')
	=>
	a
	=>c
	b
	=>c

如果加了两层引用我找不到宏名是什么:

	define(``a'',`b')
	=>
	a
	=>a
	`a'
	=>a
	``a''
	=>`a'

所以,define 的第一个参数还是别用两层引用吧。

© 著作权归作者所有

共有 人打赏支持
R
粉丝 2
博文 4
码字总数 3906
作品 0
益阳
程序员
加载中

评论(1)

王洪敏
王洪敏
我来和楼主交流下文章最后一个疑问

define(``a'',`b')
defn(``a'')
即可
详解linux下auto工具制作Makefile源码包(工具安装篇)

详解linux下auto工具制作Makefile源码包(工具安装篇) 水木杨 一、引子 最近学习安装源码包,然后公司开发也需要制作源码包,所以就稍微学习了一下automake与autoconf制作configure以及Mak...

慎道
2011/07/14
0
0
cmake ..这一步就报错,m4,autoconf和automake都安装了啊

make: *** [aclocal.m4] 错误 127 CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/sh /app/bin/QConf/deps/gdbm/build-aux/missing aclocal-1.14 -I m4 /app/bin/QConf/deps/gdbm/build-aux/m......

GreatQing
2015/11/06
2.1K
0
PHP动态编译出现Cannot find autoconf

在安装完PHP后,想动态编译PHP的memcache扩展库 cd memcache-2.2.5/ /usr/local/webserver/php/bin/phpize ./configure --with-php-config=/usr/local/webserver/php/bin/php-config 但是执行......

晨曦之光
2012/03/09
773
0
php为redis创造编译环境出错解决办法

执行/usr/local/webserver/php/bin/phpize时出现错误:Configuring for: PHP Api Version: 20041225 Zend Module Api No: 20060613 Zend Extension Api No: 220060519 Cannot find autoconf.......

山鹰sniper
2014/07/17
0
0
GNU M4 1.4.17 发布,Unix 宏处理器

GNU M4 1.4.17 发布,此版本更新内容如下: 修复了更新的 glibc 头; 解决了 mingw 转移大量文本的问题 改进了几个 gnulib 应用的可移植性 GNU M4 是一个实现了传统 Unix 的宏处理器,大部分...

oschina
2014/01/13
646
0
gnu m4 和 m4 有什么区别呢?

gnu m4 和 m4 有什么区别呢?在/usr/bin下有gm4和m4,两个文件大小相同。

RickHuang
2011/08/24
1K
2
gcc automake autoconf m4

http://ftp.gnu.org/gnu/gcc/ http://ftp.gnu.org/gnu/automake/ http://ftp.gnu.org/gnu/autoconf/ http://ftp.gnu.org/gnu/m4/...

epiclight
2015/06/30
0
0
GNU libtool 2.4.3 发布,通用库支持脚本

GNU libtool 2.4.3 发布,上一个版本是 2.4.2(2011-10-17),此版本现已提供下载(libtool-2.4.3.tar.gz),更新内容如下: 新特性 - Moved to gnulib release infrastructure. - M4 is no...

oschina
2014/10/28
1K
1
Linux GNU C语言项目组织工具 autotools 使用

转载说明: 虽然没有开发过C语言的大型项目,但一直对C语言的项目组织比较感兴趣。当然不是Visual Sutdio,CodeBlock 这类IDE的项目组织,而是GNU 系列开源工具。 如果在用过Linux系统就知道...

从前
2012/10/22
0
2
不重新编译PHP为php增加openssl.so模块

首先查看php版本 php -v 可以使用php -m来查看是否存在此模块 找到安装php的源文件 cd /home/admin/software/php-5.2.0/ext/openssl/ openssl目录下有个config.w32和config0.m4,把config0.m...

weijixian1015
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

expect脚本同步文件、expect脚本指定host和要同步的文件、构建文件分发系统

expect脚本同步文件 更改权限 执行脚本 查看执行结果 expect eof需要加上,作用是等脚本命令执行完再进行退出 expect脚本指定host和要同步的文件 更改权限,执行脚本 构建文件分发系统 需求背...

Zhouliang6
8分钟前
1
0
Hive应用:外部分区表

Hive应用:外部分区表 介绍 Hive可以创建外部分区表。创建表的时候,分区要在建表语句中体现。建完之后,你不会在表中看到数据,需要进行分区添加,使用alter语句进行添加。然后数据才会显示...

星汉
18分钟前
0
0
点击Enter登录

1. 效果 2. 实现过程(记得引入jq文件) //6.回车事件 登录 $(function() { document.onkeydown = function(event) { var e = event || window.event || arguments.callee.caller.arguments......

Lucky_Me
23分钟前
1
0
点击菜单内容切换

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .menu{ height: 38px; background-color: #eeeeee; line-height: 38px; } .mao{ ......

南桥北木
今天
1
0
OSChina 周六乱弹 —— 妹子和游戏哪个更好玩

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享唐朝乐队的单曲《国际歌》 《国际歌》- 唐朝乐队 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子- :日常祈雨 邪恶的大祭...

小小编辑
今天
460
6
流利阅读笔记32-20180721待学习

“人工智能”造假:只有人工,没有智能 Lala 2018-07-21 1.今日导读 当今社会,擅长单个方面的人工智能已经盛行,手机借助 AI 智慧防抖技术帮助大家拍出清晰照片,谷歌研发的 AI 助手将可以帮...

aibinxiao
今天
6
0
我的成长记录(一)

今天突然精神抖擞,在我的博客下新开一项分类>成长记录,专门记录每隔一段时间我的一点感悟吧。因为今天才专门花时间新开这样一个分类,所以以前有过的一些感悟没有记录下来,现在已经想不起...

dtqq
今天
1
0
机器学习管理平台 MLFlow

最近工作很忙,博客一直都没有更新。抽时间给大家介绍一下Databrick开源的机器学习管理平台-MLFlow。 谈起Databrick,相信即使是不熟悉机器学习和大数据的工程湿们也都有所了解,它由Spark的...

naughty
今天
7
0
idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
2
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部