'\" te .\" Copyright 1989 AT&T .\" Copyright (c) 2007, 2010, Oracle and/or its affiliates.All rights reserved. .\" Portions Copyright (c) 1992, X/Open Company Limited All Rights Reserved .\" Sun Microsystems, Inc. gratefully acknowledges The Open Group for permission to reproduce portions of its copyrighted documentation.Original documentation from The Open Group can be obtained online at http://www.opengroup.org/bookstore/. .\" The Institute of Electrical and Electronics Engineers and The Open Group, have given us permission to reprint portions of their documentation.In the following statement, the phrase"this text" refers to portions of the system documentation.Portions of this text are reprinted and reproduced in electronic form in the Sun OS Reference Manual, from IEEE Std 1003.1, 2004 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2004 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group.In the event of any discrepancy between these versions and the original IEEE and The Open Group Standard,the original IEEE and The Open Group Standard is the referee document.The original Standard can be obtained online at http://www.opengroup.org/unix/online.html.This notice shall appear on any product containing this material. .TH m4 1 "2010 年 8 月 11 日" "SunOS 5.11" "用户命令" .SH 名称 m4 \- 宏处理程序 .SH 用法概要 .LP .nf \fB/usr/bin/m4\fR [\fB-e\fR] [\fB-s\fR] [\fB-B\fR \fIint\fR] [\fB-H\fR \fIint\fR] [\fB-S\fR \fIint\fR] [\fB-T\fR \fIint\fR] [\fB-D\fR\fIname\fR [\fI=val\fR]] ... [\fB-U\fR \fIname\fR] ... [\fIfile\fR]... .fi .LP .nf \fB/usr/xpg4/bin/m4\fR [\fB-e\fR] [\fB-s\fR] [\fB-B\fR \fIint\fR] [\fB-H\fR \fIint\fR] [\fB-S\fR \fIint\fR] [\fB-T\fR \fIint\fR] [\fB-D\fR\fIname\fR [...\fI=val\fR]] [\fB-U\fR \fIname\fR] ... [\fIfile\fR]... .fi .SH 描述 .sp .LP \fBm4\fR 实用程序是将作为 C、汇编程序和其他语言前端的宏处理程序。每个参数文件都将按顺序处理。如果没有文件,或者文件为 \fB-\fR,则会读取标准输入。处理的文本将写入标准输出。\fB注:\fR\fBm4\fR 无法包括九个以上的嵌套文件,并将在超过此数量时写入诊断消息。 .SS "宏语法" .sp .LP 宏调用采用以下格式: .sp .in +2 .nf \fIname\fR(\fIarg1\fR,\fIarg2\fR, ..., \fIargn\fR) .fi .in -2 .sp .sp .LP 左括号字符 \fB(\fR 必须紧随宏名称之后。如果定义的宏名称之后不是 \fB(\fR,则会将其视为没有参数的宏的调用。潜在的宏名称包括字母数字字符和下划线 (\fB_\fR),其中第一个字符不是数字。 .sp .LP 收集参数时会忽略不带引号的前导空格、制表符以及\fB换行符\fR。左右单引号将用于引用字符串。引用字符串的值是除去引号的字符串。 .SS "宏处理" .sp .LP 识别宏名称后,可通过搜索匹配的右括号来搜集其参数。如果所提供的参数少于宏定义中的参数,则会将结尾参数视为 \fINULL\fR。宏计算会在收集参数期间正常继续,且在嵌套调用值中出现的任何逗号或右括号与原始输入文本中的逗号或右括号效果相同。收集参数后,宏的值将推回到输入流并重新扫描。 .SH 选项 .sp .LP 选项及其作用如下: .sp .ne 2 .mk .na \fB\fB-B\fR\fIint\fR\fR .ad .RS 9n .rt 将推回和参数收集缓冲区的大小从 4096 的缺省值进行更改。忽略小于或等于零的值,此时会使用缺省值。 .RE .sp .ne 2 .mk .na \fB\fB-e\fR\fR .ad .RS 9n .rt 交互式操作。忽略中断且不缓冲输出。 .RE .sp .ne 2 .mk .na \fB\fB-H\fR\fIint\fR\fR .ad .RS 9n .rt 将符号表散列数组的大小从 199 的缺省值进行更改。为获取更佳性能,大小应该为素数。忽略小于或等于零的值,此时会使用缺省值。 .RE .sp .ne 2 .mk .na \fB\fB-s\fR\fR .ad .RS 9n .rt 为 C 预处理程序启用行同步输出 (\fB#\fRline . . . ) .RE .sp .ne 2 .mk .na \fB\fB-S\fR\fIint\fR\fR .ad .RS 9n .rt 将调用堆栈的大小从 100 槽位的缺省值进行更改。宏占用三个槽位,非宏参数占用一个。忽略小于或等于零的值,此时会使用缺省值。 .RE .sp .ne 2 .mk .na \fB\fB-T\fR\fIint\fR\fR .ad .RS 9n .rt 将标记缓冲区的大小从 512 字节的缺省值进行更改。忽略小于或等于零的值,此时会使用缺省值。 .RE .sp .LP 要生效,以上标记必须在任何文件名称和任何 \fB-D\fR 或 \fB-U\fR 标记之前出现: .sp .ne 2 .mk .na \fB\fB-D\fR \fIname\fR[\fB= \fR\fBval\fR]\fR .ad .RS 18n .rt 如果缺少 \fBval\fR,则将 \fIname\fR 定义为 \fBval\fR 或 \fINULL\fR。 .RE .sp .ne 2 .mk .na \fB\fB-U\fR\fIname\fR\fR .ad .RS 18n .rt 取消定义 \fIname\fR。 .RE .SH 操作数 .sp .LP 支持下列操作数: .sp .ne 2 .mk .na \fB\fIfile\fR\fR .ad .RS 8n .rt 要处理的文本文件的路径名称。如果未指定 \fIfile\fR,或者如果指定了 -,则读取标准输入。 .RE .SH 用法 .sp .LP \fBm4\fR 实用程序可使以下内置宏可用。可重新定义这些宏,但一旦重新定义,就会丢失原始含义。除非另有说明,否则它们的值为 \fINULL\fR。 .sp .ne 2 .mk .na \fB\fBchangequote\fR\fR .ad .RS 15n .rt 将引用符号更改为第一个和第二个参数。符号最长可为五个字符。没有参数的 \fBchangequote\fR 会恢复原始值(即 \fB` '\fR)。 .RE .sp .ne 2 .mk .na \fB\fBchangecom\fR\fR .ad .RS 15n .rt 从缺省 \fB#\fR 和\fB换行符\fR中更改左右注释标记。如果没有参数,则会有效禁用注释机制。如果有一个参数,则左标记会成为参数,右标记会成为\fB换行符\fR。如果有两个参数,则两个标记都会受影响。注释标记最长可为五个字符。 .RE .sp .ne 2 .mk .na \fB\fBdecr\fR\fR .ad .RS 15n .rt 返回的值为参数值减 1。 .RE .sp .ne 2 .mk .na \fB\fBdefine\fR\fR .ad .RS 15n .rt 第二个参数作为名称为第一个参数的宏的值安装。替换文本中出现的每个 \fB$\fR\fI n\fR(其中 \fIn\fR 为数字)都会被第 \fIn\fR 个参数所替代。参数 0 是宏的名称;空字符串会取代缺少的参数;参数数量会取代 \fB$#\fR;由逗号分隔的所有参数的列表会取代 \fB$*\fR;\fB$@\fR 类似 \fB$*\fR,但每个参数都会(使用当前引号)引起来。 .RE .sp .ne 2 .mk .na \fB\fBdefn\fR\fR .ad .RS 15n .rt 返回用引号引起的其参数的定义。这对于重命名宏非常有用,尤其是内置项。 .RE .sp .ne 2 .mk .na \fB\fBdivert\fR\fR .ad .RS 15n .rt \fBm4\fR 维护 10 个输出流,编号为 0-9。最终的输出是按数值顺序排列的串联流。初始流 0 是当前流。\fBdivert\fR 宏会将当前输出流更改为其(数字字符串)参数。放弃转移到 0 到 9 之外的流的输出。 .RE .sp .ne 2 .mk .na \fB\fBdivnum\fR\fR .ad .RS 15n .rt 返回当前输出流的值。 .RE .sp .ne 2 .mk .na \fB\fBdnl\fR\fR .ad .RS 15n .rt 读取并放弃到(含)下一个\fB换行符\fR的字符。 .RE .sp .ne 2 .mk .na \fB\fBdumpdef\fR\fR .ad .RS 15n .rt 为指定项目列显当前名称和定义,如果没有提供参数,则会为所有条目列显当前名称和定义。 .RE .sp .ne 2 .mk .na \fB\fBerrprint\fR\fR .ad .RS 15n .rt 列显诊断输出文件的参数。 .RE .sp .ne 2 .mk .na \fB\fBifdef\fR\fR .ad .RS 15n .rt 如果定义了第一个参数,则值为第二个参数,否则为第三个。如果没有第三个参数,则值为 \fINULL\fR。预定义单词 \fBunix\fR。 .RE .sp .ne 2 .mk .na \fB\fBifelse\fR\fR .ad .RS 15n .rt 该宏有三个或更多个参数。如果第一个参数是与第二个参数相同的字符串,则值为第三个参数。如果不是,且有四个以上的参数,则进程会重复使用参数 4、5、6 和 7。否则,值为第四个字符串,如果没有第四个字符串,则为 \fINULL\fR。 .RE .sp .ne 2 .mk .na \fB\fBinclude\fR\fR .ad .RS 15n .rt 返回在参数中指定的文件的内容。 .RE .sp .ne 2 .mk .na \fB\fBincr\fR\fR .ad .RS 15n .rt 返回的值为参数值加 1。通过将初始数字字符串解释为十进制数字来计算参数值。 .RE .sp .ne 2 .mk .na \fB\fBindex\fR\fR .ad .RS 15n .rt 返回第一个参数中第二个参数开始的位置(零原点),如果没有出现第二个参数,则为 -1。 .RE .sp .ne 2 .mk .na \fB\fBlen\fR\fR .ad .RS 15n .rt 返回参数中字符的数量。 .RE .sp .ne 2 .mk .na \fB\fBm4exit\fR\fR .ad .RS 15n .rt 该宏会导致从 \fBm4\fR 中立即退出。参数 1(如果已提供)为退出代码;缺省值为 \fB0\fR。 .RE .sp .ne 2 .mk .na \fB\fBm4wrap\fR\fR .ad .RS 15n .rt 参数 1 会在最终 \fBEOF\fR 时推回。示例:\fBm4wrap(`cleanup( )')\fR .RE .sp .ne 2 .mk .na \fB\fBmaketemp\fR\fR .ad .RS 15n .rt 以当前进程 \fBID\fR 在其参数中填写 "\fBX\fR" 字符的字符串。 .RE .sp .ne 2 .mk .na \fB\fBpopdef\fR\fR .ad .RS 15n .rt 删除其参数的当前定义,公开上一个定义(如果有)。 .RE .sp .ne 2 .mk .na \fB\fBpushdef\fR\fR .ad .RS 15n .rt 与 \fBdefine\fR 类似,但会保存之前的任何定义。 .RE .sp .ne 2 .mk .na \fB\fBshift\fR\fR .ad .RS 15n .rt 返回除第一个参数之外的所有参数。其他参数都由引号引起并被推回,参数之间以逗号分隔。引用格式将废除此后将执行的额外扫描的效果。 .RE .sp .ne 2 .mk .na \fB\fBsinclude\fR\fR .ad .RS 15n .rt 该宏与 \fBinclude\fR 相同,除了当文件不可访问之外,它不会指出任何内容。 .RE .sp .ne 2 .mk .na \fB\fBsubstr\fR\fR .ad .RS 15n .rt 返回其第一个参数的子串。第二个参数是选择第一个字符的零原点数字;第三个参数表示子串的长度。如果缺少第三个参数,则认为有足够大的空间扩展到第一个字符串的末尾。 .RE .sp .ne 2 .mk .na \fB\fBsyscmd\fR\fR .ad .RS 15n .rt 该宏会执行在第一个参数中提供的命令。不会返回任何值。 .RE .sp .ne 2 .mk .na \fB\fBsysval\fR\fR .ad .RS 15n .rt 该宏是从上次调用到 \fBsyscmd \fR 的返回代码。 .RE .sp .ne 2 .mk .na \fB\fBtranslit\fR\fR .ad .RS 15n .rt 将第一个参数中的字符从第二个参数提供的集直接转换为第三个参数提供的集。不允许使用缩写。 .RE .sp .ne 2 .mk .na \fB\fBtraceon\fR\fR .ad .RS 15n .rt 该宏没有参数,会打开所有宏的跟踪(包括内置项)。否则,会打开指定宏的跟踪。 .RE .sp .ne 2 .mk .na \fB\fBtraceoff\fR\fR .ad .RS 15n .rt 全局关闭跟踪以及为任何指定的宏关闭跟踪。 .RE .sp .ne 2 .mk .na \fB\fBundefine\fR\fR .ad .RS 15n .rt 删除在其参数中指定的宏的定义。 .RE .sp .ne 2 .mk .na \fB\fBundivert\fR\fR .ad .RS 15n .rt 该宏会导致从指定为参数的转移中立即输出文本,如果没有参数,则为所有转移立即输出文本。可将文本取消转移到其他转移。取消转移功能将放弃转移的文本。 .RE .SS "/usr/bin/m4" .sp .ne 2 .mk .na \fB\fBeval\fR\fR .ad .RS 8n .rt 以算数表达式计算其参数,使用 32 位带符号整数运算。支持以下运算符:括号、一元 -、一元 +、!、~、*、/、%、+、-、关系、按位 &、|、&& 和 ||。与在 C 中一样,可以指定八进制和十六进制数。第二个参数指定结果的基数,缺省值为 10。第三个参数可用于指定结果中的最小数值。 .RE .SS "/usr/xpg4/bin/m4" .sp .ne 2 .mk .na \fB\fBeval\fR\fR .ad .RS 8n .rt 以算数表达式计算其参数,使用 32 位带符号整数运算。支持以下运算符:括号、一元 -、一元 +、!、~、*、/、%、+、-、<<、>>、关系、按位 &、|、&& 和 ||。优先级和关联性都与在 C 中一样。与在 C 中一样,也可以指定八进制和十六进制数。第二个参数指定结果的基数,缺省值为 10。第三个参数可用于指定结果中的最小数值。 .RE .SH 示例 .LP \fB示例 1 \fRm4 文件示例 .sp .LP 如果文件 \fBm4src\fR 包含行: .sp .in +2 .nf 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 .fi .in -2 .sp .sp .LP 那么命令: .sp .in +2 .nf \fBm4 m4src\fR .fi .in -2 .sp .sp .LP 或命令: .sp .in +2 .nf \fBm4 -U VER m4src\fR .fi .in -2 .sp .sp .LP 会生成输出: .sp .in +2 .nf The value of VER is "VER". VER is not defined. VER is not 2. end .fi .in -2 .sp .sp .LP 此命令: .sp .in +2 .nf \fBm4 -D VER m4src\fR .fi .in -2 .sp .sp .LP 会生成输出: .sp .in +2 .nf The value of VER is "". VER is defined to be . VER is not 2. end .fi .in -2 .sp .sp .LP 此命令: .sp .in +2 .nf \fBm4 -D VER=1 m4src\fR .fi .in -2 .sp .sp .LP 会生成输出: .sp .in +2 .nf The value of VER is "1". VER is defined to be 1. VER is 1. VER is not 2. end .fi .in -2 .sp .sp .LP 此命令: .sp .in +2 .nf \fBm4 -D VER=2 m4src\fR .fi .in -2 .sp .sp .LP 会生成输出: .sp .in +2 .nf The value of VER is "2". VER is defined to be 2. VER is 2. end .fi .in -2 .sp .SH 环境变量 .sp .LP 有关影响 \fBm4\fR 执行的以下环境变量的说明,请参见 \fBenviron\fR(5):\fBLANG\fR、\fBLC_ALL\fR、\fBLC_CTYPE\fR、\fBLC_MESSAGES\fR 和 \fBNLSPATH\fR。 .SH 退出状态 .sp .LP 将返回以下退出值: .sp .ne 2 .mk .na \fB\fB0\fR\fR .ad .RS 6n .rt 成功完成。 .RE .sp .ne 2 .mk .na \fB\fB>0\fR\fR .ad .RS 6n .rt 出现错误 .RE .sp .LP 如果使用了 \fBm4exit\fR 宏,则可通过输入文件指定退出值。 .SH 属性 .sp .LP 有关下列属性的说明,请参见 \fBattributes\fR(5): .SS "\fB/usr/bin/m4\fR" .sp .sp .TS tab() box; cw(2.75i) |cw(2.75i) lw(2.75i) |lw(2.75i) . 属性类型属性值 _ 可用性system/core-os .TE .SS "\fB/usr/xpg4/bin/m4\fR" .sp .sp .TS tab() box; cw(2.75i) |cw(2.75i) lw(2.75i) |lw(2.75i) . 属性类型属性值 _ 可用性system/xopen/xcu4 _ 接口稳定性Committed(已确定) _ 标准请参见 \fBstandards\fR(5)。 .TE .SH 另请参见 .sp .LP \fBas\fR(1)、\fBattributes\fR(5)、\fBenviron\fR(5)、\fBstandards\fR(5)