m4 命令

用途

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

语法

m4 [ -e] [ -我 ] [ -s ] [ B 数字 ] [ -D 名称 [ = ] ] ... [ -H 数字 ] [ -我 目录 ] [ -S 数字 ] [ -T 数字 ] [ -U 名称 ] ... [ 文件 ... ]

描述

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

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

macroname(argument . . . )

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

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

m4 命令识别一个宏时,它以搜索匹配的右括号的方式收集参数。 如果提供的自变量少于宏定义中出现的自变量,那么 m4 命令会将定义中的尾部自变量视为空。 宏求值在收集自变量期间正常进行。 嵌套宏调用的值中的所有逗号或右括号都按字面翻译; 它们不需要转义字符或引号。 收集参数后,m4 命令将宏的值推回到输入流并再次扫描。

内置宏

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

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

标志

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

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

描述
-D 名称[=] Name 变量定义为 Value 变量。 如果不指定 Value 变量,那么 Name 变量为空。
-U 名称 取消定义之前用 -D标志定义的Name变量。

退出状态

本命令返回以下退出值:

描述
重大安全事件数量 成功完成。
> 0 发生错误。

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

示例

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

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

文件

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