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 替换宏 Name。 NewName 字符串可以采用格式 $n .。 (其中 n 是一个数字)。 在这种情况下,替换文本中出现的每次 n 都将替换为 Name的 n自变量。$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 设置为 ON 和 XPG_UNIX98 设置为 OFF来获取 UNIX 10 行为。
|
| shift(自变量 。 .) | 返回除第一个参数之外的所有参数。 其他参数加引号并以逗号隔开推回。 加引号使随后进行的额外扫描失效。 |
| changequote(L,R) | 将引号符号更改为 L 和 R。 符号最长可以为 5 字节。 不带参数的 changequote 恢复原始值(` ')。 |
| changecom(L,R) | 将左右注释标记从缺省 # 和换行符更改为 L 和 R。 如果没有参数,那么将禁用注释机制。 带一个参数,左注释标记变成这个参数而右注释变成换行符。 带两个参数,两个标记都有效。 注释标记可以是 5 个字节长。 |
| 转移(Number) | 将当前输出流更改到流 Number。 有 10 个输出流,号码为 0-9。 最终的输出是按字母顺序连接的流。 初始时,流 0 是当前流。 m4 命令废弃转向到一个不同于 0-9 的流的输出。 |
| un乱(Number )。 .) | 从指定的转移(或者如果没有参数时则为所有转移)的直接文本输出。 文本可能取消转向到另一个转移。 取消转向废弃已转向的文本。 |
| divnum | 返回当前输出流的值。 |
| dnl | 读取并废弃在下一个换行符前(包括下一个换行符)的字符。 |
| ifelse([String1,String2,True,[False]。 .) | 如果 String1 和 String2 相同,那么该值为 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 设置为 ON 和 XPG_UNIX98 设置为 OFF来获取 UNIX 10 行为。
|
| len(字符串) | 以 String 返回字节数。 |
| dlen(字符串) | 以 String 返回可显示的字符数,即 2 字节的扩展字符被计为一个可显示字符。 |
| index(String1,String2) | 返回字符串 String1 中字符串 String2 的开始位置(原点为 0),如果第二个参数没有出现则为 -1。 |
| substr(String,Position, [Number]) | 返回 String 的一个子串。 用 Position 选定子串的开始,并且 Number 表示子串的长度。 如果没有 Number 参数,那么子串包含至第一个字符串的结尾的所有字符。 |
| 转换(String,From,To) | 将 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 命令。 |