m4 命令

m4 命令

用途

预处理文件,扩展宏定义。

语法

m4 [ -e] [ -l ] [ -s ] [ -B Number ] [ -D Name [ =Value ] ] ... [ -H Number ] [ -I Directory ] [ -S Number ] [ -T Number ] [ -U Name ] ... [ File ... ]

描述

m4 命令用作 C 和其它语言的预处理程序的一个宏处理程序。可以用它来处理内置宏或用户定义的宏。

按顺序处理每个 File 参数。如果没有指定 File 参数,或者如果指定了 -(短划线)作为文件名,那么 m4 命令读取标准输入。它将处理过的宏写到标准输出中。宏调用采用以下格式:

 

macroname(argument . . . )

左括号必须紧接着 macroname。如果左括号没有紧跟着定义的宏名,那么 m4 命令将它当作不带参数的宏调来读取。宏名由 ASCII 字母、数字和 _(下划线)字符组成。扩展字符不允许出现在宏名中。第一个字符不能为数字。

收集参数时,m4 命令忽略宏名的开头未加引号的空格、制表符和换行符。使用单引号将字符串括起来。括起来的字符串的值是将引号去掉后的字符串。

m4 命令识别一个宏时,它以搜索匹配的右括号的方式收集参数。如果提供的参数比宏定义中的少,那么 m4 命令认为定义末尾出现的参数为空。在收集参数的过程中,宏求值处理正常进行。所有在嵌套调用值中的逗号或右括号被逐字转换;它们不需要一个转义字符或引号。收集参数后,m4 命令将宏的值推回到输入流并再次扫描。

内置宏

以下内置宏在 m4 命令中是可用的。可以重新定义它们,但可能会丢失原始含义。这些宏的值是空的,除非另有说明:

define(Name,NewName) 用值 NewName 替换宏 NameNewName 字符串可以用 $n . . . (其中 n 是一个数字)。在这种情况下,替代文字中每个出现 n 的地方用 Name 中的第 n 个参数替代。$0 是宏名。空字符串替换空缺的参数。参数的数目替代 $#。逗号分隔的所有参数的列表替换 $*。$@ 和 $* 相似,但是每个参数是用当前引号字符括起来的(请参阅 changequote)。
undefine(Name) 除去 Name 的定义。
defn(Name . . . ) 返回括起来的 Name 定义。
pushdef(Name, NewName) 如同在 define 中那样,使用 NewName 重新定义 Name,但是保存任何以前的定义。
popdef(Name . . . ) 除去 Name 的当前定义并返回到以前的定义(如果存在)。
ifdef(Name,True,[False]) 仅在 Name 被定义且不为 0 时返回 True,否则返回 False。如果不支持 False,那么它的值为空。
shift(Argument . . . ) 返回除第一个参数之外的所有参数。其它参数加引号并以逗号隔开推回。加引号使随后进行的额外扫描失效。
changequote(L,R) 更改引号为符号 LR。符号可以是 5 个字节长。不带参数的 changequote 恢复原始值(` ')。
changecom(L,R) 将缺省的左注释标记(#)和右注释标记(换行符)更改为 LR。假如不带参数,禁用注释机制。带一个参数,左注释标记变成这个参数而右注释变成换行符。带两个参数,两个标记都有效。注释标记可以是 5 个字节长。
divert(Number) 将当前输出流更改到流 Number。有 10 个输出流,号码为 0-9。最终的输出是按字母顺序连接的的流。初始时,流 0 是当前流。m4 命令废弃转向到一个不同于 0-9 的流的输出。
undivert(Number . . . ) 从指定的转移(或者如果没有参数时则为所有转移)的直接文本输出。文本可能取消转向到另一个转移。取消转向废弃已转向的文本。
divnum 返回当前输出流的值。
dnl 读取并废弃在下一个换行符前(包括下一个换行符)的字符。
ifelse([String1,String2,True,[False]] . . . ) 如果 String1String2 相同,那么该值为 True。如果不同或者有多于四个的参数,那么 m4 命令重复处理附加参数(4、5、6 和 7)。否则,值为 False 或空(如果没有 False 值)。
incr(Number) 返回的是加 1 的参数值。
decr(Number) 返回的是减 1 的参数值。
eval(Expression[,Number1[,Number2]]) 使用 32 位运算求其作为算术表达式的第一个参数的值。可以使用运算符 +、-、*、/、%、 ^ (乘方)、一位宽度 &、|、 ~ 和 ^ 关系运算符和圆括号。可以在 C 中指定八进制和十六进制数。Number1 指定表达式结果的基。缺省基是 10。可以选择 Number2 来指定结果中的最小数字。
len(String) String 返回字节数。
dlen(String) String 返回可显示的字符数,即 2 字节的扩展字符被计为一个可显示字符。
index(String1,String2) 返回字符串 String1 中字符串 String2 的开始位置(原点为 0),如果第二个参数没有出现则为 -1。
substr(String,Position, [Number] ) 返回 String 的一个子串。用 Position 选定子串的开始,并且 Number 表示子串的长度。如果没有 Number 参数,那么子串包含至第一个字符串的结尾的所有字符。
translit(String,From,To) String 中的字符从 From 给出的集直译为 To 给出的集。不允许缩写。2 字节的扩展字符正确地映射到对应的替换字符中。
include(File) 返回 File 的内容或者显示错误信息(如果它不能访问此文件)。
sinclude(File) 返回 File 的内容,但是如果 File 是不可访问的,则不显示错误信息。
syscmd(Command) 运行 Command。不返回值。
sysval 返回最后调用 syscmd 中的返回码。
maketemp( . . . nnnn  . . . ) 用当前进程 ID 号替换参数中的 nnnn
m4exit(Value) 快速退出 m4,返回指定的退出 Value(缺省为 0)。
m4wrap(LastMacro) 读取文件结束符后运行 LastMacro。例如,m4wrap (`cleanup ()')m4 结束时运行清除宏。
errprint(Message) 包含诊断输出文件中的 Message
dumpdef([Name . . . ]) 将指定的项或所有项(如果没有提供参数)的当前名称和定义写到标准输出中。
traceon(Macro) 打开 Macro 跟踪。如果没有指定,则对所有宏开启跟踪。
traceoff(Macro . . . ) 关闭全局跟踪和任何指定 Macro 的跟踪。用 traceon 特定跟踪的宏只可由 traceoff 的特定调用来取消跟踪。

标志

 

-B Number 使 Number 变量成为推回和参数收集缓冲区的大小(缺省值为 4096)。
-e 交互操作。忽略中断且不对输出进行缓冲。
-H Number 使 Number 变量成为符号表散列数组的大小(缺省值是 199)。这个大小必须是一个素数。
-I Directory (大写 i)首先搜索 Directory 变量,然后在标准列表的目录中搜索那些名称不以 /(斜杠)开头的包含(内置宏)文件。
-l (小写字母 L)启用汇编程序的行编号输出 (.xline . . .).
-s 启用 C 预处理器的行同步输出 (#line . . .).
-S Number 使 Number 变量成为调用堆栈的大小(缺省值为 100 个插槽)。宏占用 3 个插槽,非宏参数占用 1 个插槽。
-T Number 使 Number 变量成为标记缓冲区的大小(缺省值为 152 个字节)。

前面的标志必须出现在任何文件名和任何 -D-U 标志之前。

-D Name[=Value] Name 变量定义为 Value 变量。如果不指定 Value 变量,则 Name 变量为空。
-U Name 取消定义以前由 -D 标志定义的 Name 变量。

退出状态

这条命令返回以下退出值:

0 成功结束。
>0 发生错误。

如果使用 m4exit 宏,那么可以由输入文件指定退出值。

示例

要用 m4 命令预处理一个 C 语言程序并进行编译,请输入:

 

m4 prog.m4 > prog.c
cc prog.c

文件

 

/usr/ccs/bin/m4 包含 m4 命令。

相关信息

AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 中的 m4 Macro Processor Overview。

《AIX 5L V5.2 系统用户指南:操作系统与设备》中的『命令概述』。

 

你可能感兴趣的:(m4 命令)