Go to main content

手册页部分 1:用户命令

退出打印视图

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

xstr(1)

名称

xstr - 从 C 程序提取字符串以实现共享字符串

用法概要

xstr -c filename [-v] [-l array]
xstr [-l array]
xstr filename [-v] [-l array]

描述

xstr 维护名为 strings 的文件,大型程序组件部分中的字符串会散列至该文件。将使用通用区域的引用来替换这些字符串。这将用于实现共享的常量字符串,如果字符串同时为只读状态,则作用最大。

此命令:

example% xstr −c filename

提取指定 C 源中的字符串,通过 &xstr[number] 格式的表达式替换一定数量的字符串引用。文件前会附加相应的 xstr 声明。会将生成的 C 文本置于文件 x.c 中,然后编译该文件。如果 strings 数据库尚不包含来自此文件的字符串,则会将字符串置于该数据库中。如果字符串重复,或者字符串是现有字符串的后缀,则数据库不会发生任何变化。

编译了大型程序中的所有组件后,可通过以下格式的命令创建声明通用 xstr 空间(名为 xs.c)的文件:

example% xstr

随后应该使用剩余程序编译并装入 xs.c 文件。如果可能,可以将数组设置为只读(共享)以节约空间和交换开销。

xstr 也可用于单个文件。命令:

example% xstr filename

可像之前那样创建文件 x.cxs.c,不会使用或影响相同目录中的任何 strings 文件。

如果有任何宏定义会生成字符串,或者有条件代码包含实际上不需要的字符串,则在 C 预处理程序之后运行 xstr 可能非常有用。如果提供了 "-" 参数,则 xstr 会从标准输入中进行读取。在 C 预处理程序之后运行 xstr 的合适命令序列为:

example% cc −E name.c | xstr −c −
example% cc −c x.c
example% mv x.o name.o

除非添加了新条目,否则 xstr 不会触动文件 strings;因此 make(1S) 可避免重新生成 xs.o,除非确实需要。

选项

-c filename

filename 中获取 C 源。

–v

详细模式:显示可指示新字符串或重复字符串发现位置的进度报告。

-l array

指定程序引用中指定的 array 提取字符串。缺省数组名称为 xstr

文件

strings

字符串的数据库

x.c

消息 C 源

xs.c

数组 "xstr*(rq 定义的 C 源

/tmp/xs*

xstr filename 不触动 strings 时的临时文件

属性

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

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

另请参见

make(1S)attributes(7)

已知问题

如果字符串是数据库中另一个字符串的后缀,但 xstr 首先看见更短的字符串,那么会将两个字符串都置于数据库中,但实际只需将更长的字符串置于其中即可。

附注

请注意,xstr 会随意替换具有 &xstr[number] 格式表达式的所有字符串,不管原始 C 代码以前使用该字符串的方式。例如,代码使用 sizeof() 来确定文本字符串的长度时,可能产生问题,因为 xstr 很可能会使用与字符串大小不同的指针来替换文本字符串。

    要绕开此问题,您可以:

  • 使用 strlen() 代替 sizeof();请注意,sizeof() 会返回数组的大小(包括末尾的空字节),而 strlen() 不会对空字节计数。(strlen("xxx"))+1sizeof(" xxx") 等效。

  • sizeof() 操作数使用 #define 并使用经过 define 的版本。xstr 会忽略 #define 语句。请确保首先在 filename 上运行 xstr,然后再在预处理程序上运行。

声明以下格式的初始化字符串数组时,您可能会遇到问题

char x[] = "xxx";

xstr 将使用不会编译的 &xstr[number] 格式的表达式来替换 xxx。要绕过此问题,请使用 static char *x = "xxx" 代替 static char x[] = "xxx"