Go to main content

手册页部分 1:用户命令

退出打印视图

更新时间: 2018年8月8日 星期三
 
 

m4(1)

名称

m4 - 宏处理程序

用法概要

/usr/bin/m4 [-e] [-s] [
-B int] [-H 
int] [-S int] 
     [-T int] [-D
name [=val]] ... [-U 
name] ... [file]...
/usr/xpg4/bin/m4 [-e] [-s
] [-B int] [-H 
int] [-S int] 
     [-T int] [-D
name [...=val]] [-U 
name] ... [file]...

描述

m4 实用程序是将作为 C、汇编程序和其他语言前端的宏处理程序。每个参数文件都将按顺序处理。如果没有文件,或者文件为 -,则会读取标准输入。处理的文本将写入标准输出。注:m4 无法包括九个以上的嵌套文件,并将在超过此数量时写入诊断消息。

宏语法

宏调用采用以下格式:

name(arg1,
arg2, ..., argn)

左括号字符 ( 必须紧随宏名称之后。如果定义的宏名称之后不是 (,则会将其视为没有参数的宏的调用。潜在的宏名称包括字母数字字符和下划线 (_),其中第一个字符不是数字。

收集参数时会忽略不带引号的前导空格、制表符以及换行符。左右单引号将用于引用字符串。引用字符串的值是除去引号的字符串。

宏处理

识别宏名称后,可通过搜索匹配的右括号来搜集其参数。如果所提供的参数少于宏定义中的参数,则会将结尾参数视为 NULL。宏计算会在收集参数期间正常继续,且在嵌套调用值中出现的任何逗号或右括号与原始输入文本中的逗号或右括号效果相同。收集参数后,宏的值将推回到输入流并重新扫描。

选项

选项及其作用如下:

–Bint

将推回和参数收集缓冲区的大小从 4096 的缺省值进行更改。忽略小于或等于零的值,此时会使用缺省值。

–e

交互式操作。忽略中断且不缓冲输出。

–Hint

将符号表散列数组的大小从 199 的缺省值进行更改。为获取更佳性能,大小应该为素数。忽略小于或等于零的值,此时会使用缺省值。

–s

为 C 预处理程序启用行同步输出 (#line . . . )

–Sint

将调用堆栈的大小从 100 槽位的缺省值进行更改。宏占用三个槽位,非宏参数占用一个。忽略小于或等于零的值,此时会使用缺省值。

–Tint

将标记缓冲区的大小从 512 字节的缺省值进行更改。忽略小于或等于零的值,此时会使用缺省值。

要生效,以上标记必须在任何文件名称和任何 –D–U 标记之前出现:

–D name[= val]

如果缺少 val,则将 name 定义为 val 或 NULL。

–Uname

取消定义 name

操作数

支持下列操作数:

file

要处理的文本文件的路径名称。如果未指定 file,或者如果指定了 -,则读取标准输入。

用法

m4 实用程序可使以下内置宏可用。可重新定义这些宏,但一旦重新定义,就会丢失原始含义。除非另有说明,否则它们的值为 NULL。

changequote

将引用符号更改为第一个和第二个参数。符号最长可为五个字符。没有参数的 changequote 会恢复原始值(即 ` ')。

changecom

从缺省 #换行符中更改左右注释标记。如果没有参数,则会有效禁用注释机制。如果有一个参数,则左标记会成为参数,右标记会成为换行符。如果有两个参数,则两个标记都会受影响。注释标记最长可为五个字符。

decr

返回的值为参数值减 1。

define

第二个参数作为名称为第一个参数的宏的值安装。替换文本中出现的每个 $ n(其中 n 为数字)都会被第 n 个参数所替代。参数 0 是宏的名称;空字符串会取代缺少的参数;参数数量会取代 $#;由逗号分隔的所有参数的列表会取代 $*$@ 类似 $*,但每个参数都会(使用当前引号)引起来。

defn

返回用引号引起的其参数的定义。这对于重命名宏非常有用,尤其是内置项。

divert

m4 维护 10 个输出流,编号为 0-9。最终的输出是按数值顺序排列的串联流。初始流 0 是当前流。divert 宏会将当前输出流更改为其(数字字符串)参数。放弃转移到 0 到 9 之外的流的输出。

divnum

返回当前输出流的值。

dnl

读取并放弃到(含)下一个换行符的字符。

dumpdef

为指定项目列显当前名称和定义,如果没有提供参数,则会为所有条目列显当前名称和定义。

errprint

列显诊断输出文件的参数。

ifdef

如果定义了第一个参数,则值为第二个参数,否则为第三个。如果没有第三个参数,则值为 NULL。预定义单词 unix

ifelse

该宏有三个或更多个参数。如果第一个参数是与第二个参数相同的字符串,则值为第三个参数。如果不是,且有四个以上的参数,则进程会重复使用参数 4、5、6 和 7。否则,值为第四个字符串,如果没有第四个字符串,则为 NULL。

include

返回在参数中指定的文件的内容。

incr

返回的值为参数值加 1。通过将初始数字字符串解释为十进制数字来计算参数值。

index

返回第一个参数中第二个参数开始的位置(零原点),如果没有出现第二个参数,则为 -1。

len

返回参数中字符的数量。

m4exit

该宏会导致从 m4 中立即退出。参数 1(如果已提供)为退出代码;缺省值为 0

m4wrap

参数 1 会在最终 EOF 时推回。示例:m4wrap(`cleanup( )')

maketemp

已过时。以当前进程 ID 在其参数中填写 "X" 字符的字符串。

mkstemp

应使用第一个参数作为模板来创建一个空文件,其中的尾随 "X" 字符会替换为可移植文件名字符集中的字符。如果第一个参数不以至少六个 "X" 字符结尾,则行为不确定。如果成功创建了临时文件,则宏的定义文本是新文件的名称。应将文件的用户 ID 设置为进程的有效用户 ID。应将文件的组 ID 设置为文件的父目录的组 ID 或进程的有效组 ID。以这种方式设置文件访问权限位可确保只有所有者可以读取和写入文件,而不考虑进程的当前 umask。如果无法创建文件,则宏的定义文本应该是空字符串。如果 mkstemp 后面不紧跟着 <left-parenthesis>,则行为不确定。

popdef

删除其参数的当前定义,公开上一个定义(如果有)。

pushdef

define 类似,但会保存之前的任何定义。

shift

返回除第一个参数之外的所有参数。其他参数都由引号引起并被推回,参数之间以逗号分隔。引用格式将废除此后将执行的额外扫描的效果。

sinclude

该宏与 include 相同,除了当文件不可访问之外,它不会指出任何内容。

substr

返回其第一个参数的子串。第二个参数是选择第一个字符的零原点数字;第三个参数表示子串的长度。如果缺少第三个参数,则认为有足够大的空间扩展到第一个字符串的末尾。

syscmd

该宏会执行在第一个参数中提供的命令。不会返回任何值。

sysval

该宏是从上次调用到 syscmd 的返回代码。

translit

将第一个参数中的字符从第二个参数提供的集直接转换为第三个参数提供的集。不允许使用缩写。

traceon

该宏没有参数,会打开所有宏的跟踪(包括内置项)。否则,会打开指定宏的跟踪。

traceoff

全局关闭跟踪以及为任何指定的宏关闭跟踪。

undefine

删除在其参数中指定的宏的定义。

undivert

该宏会导致从指定为参数的转移中立即输出文本,如果没有参数,则为所有转移立即输出文本。可将文本取消转移到其他转移。取消转移功能将放弃转移的文本。

/usr/bin/m4

eval

以算数表达式计算其参数,使用 32 位带符号整数运算。支持以下运算符:括号、一元 -、一元 +、!、~、*、/、%、+、-、关系、按位 &、|、&& 和 ||。与在 C 中一样,可以指定八进制和十六进制数。第二个参数指定结果的基数,缺省值为 10。第三个参数可用于指定结果中的最小数值。

/usr/xpg4/bin/m4

eval

以算数表达式计算其参数,使用 32 位带符号整数运算。支持以下运算符:括号、一元 -、一元 +、!、~、*、/、%、+、-、<<、>>、关系、按位 &、|、&& 和 ||。优先级和关联性都与在 C 中一样。与在 C 中一样,也可以指定八进制和十六进制数。第二个参数指定结果的基数,缺省值为 10。第三个参数可用于指定结果中的最小数值。

示例

示例 1 m4 文件示例

如果文件 m4src 包含行:


The value of `VER' is "VER".
        ifdef(`VER', ``VER'' is defined to be VER., VER is not defined.)
        ifelse(VER, 1, ``VER'' is `VER'.)
        ifelse(VER, 2, ``VER'' is `VER'., ``VER'' is not 2.)
        end

那么命令:

m4 m4src

或命令:

m4 -U VER m4src

会生成输出:


The value of VER is "VER".
        VER is not defined.

        VER is not 2.
        end

此命令:

m4 -D VER m4src

会生成输出:


The value of VER is "".
        VER is defined to be .

        VER is not 2.
        end

此命令:

m4 -D VER=1 m4src

会生成输出:


The value of VER is "1".
       VER is defined to be 1.
       VER is 1.
       VER is not 2.
       end

此命令:

m4 -D VER=2 m4src

会生成输出:


The value of VER is "2".
        VER is defined to be 2.

        VER is 2.
        end

环境变量

有关影响 m4 执行的以下环境变量的说明,请参见 environ(7):LANG、LC_ALL、LC_CTYPE、LC_MESSAGES 和 NLSPATH。

退出状态

将返回以下退出值:

0

成功完成。

>0

出现错误

如果使用了 m4exit 宏,则可通过输入文件指定退出值。

属性

有关下列属性的说明,请参见 attributes(7)

/usr/bin/m4

属性类型
属性值
可用性
system/core-os

/usr/xpg4/bin/m4

属性类型
属性值
可用性
system/xopen/xcu4
接口稳定性
Committed(已确定)
标准
请参见 standards(7)

另请参见

as(1)attributes(7)environ(7)standards(7)