Oracle Solaris Studio 12.4 Man Pages

Exit Print View

Updated: January 2015
 
 

cscope(1)

Name

cscope - 交互式检查 C 程序

Synopsis

cscope [options] files...

Description

cscope 是一个面向屏幕的交互式工具,允许用户浏览 C 源文件,从中查找指定的代码元素。

缺省情况下,cscope 会在当前目录中检查 C(.c.h)、lex (.l) 和 yacc (.y) 源文件。对于在命令行中指定的源文件,也可能会调用 cscope。在任何一种情况下,cscope 都会在标准目录中搜索在当前目录中未找到的 #include 文件。缺省情况下,cscope 使用符号交叉引用 cscope.out 在文件中查找函数、函数调用、宏、变量和预处理程序符号。

首次对浏览的程序的源文件使用 cscope 时,它会生成符号交叉引用。在后续调用中,仅当源文件已更改或源文件列表不同时,cscope 才会重新生成交叉引用。重新生成交叉引用时,将从旧交叉引用复制未更改文件的数据,这使得重新生成比初始生成速度要快。

Options

以下选项能以任意组合出现:

-b

仅生成交叉引用。

-C

搜索时不区分字母大小写。

-c

在交叉引用文件中仅使用 ASCII 字符,即不压缩数据。

-d

不更新交叉引用。

-e

禁止文件之间的 ^e 命令提示符。

-f reffile

使用 reffile 作为交叉引用文件名,而非缺省值 cscope.out

-I incdir

incdir 中查找(在标准位置(通常是 /usr/include)中查找头文件之前)名称不是以 / 开头且未在命令行中或以下 namefile 中指定的任何 #include 文件。(#include 文件可能以双引号或尖括号指定。)除当前目录(首先搜索)和标准列表(最后搜索)之外,还会搜索 incdir 目录。如果 -I 出现多次,将以在命令行中出现的顺序搜索目录。

-i namefile

浏览名称在 namefile 中列出的所有源文件(文件名由空格、制表符或换行符分隔)而非缺省值 (cscope.files)。如果指定了此选项,cscope 将忽略命令行中出现的任何文件。

-L

-num pattern 选项一起使用时,利用面向行的输出执行单一搜索。

-l

面向行的界面(请参见下文“面向行的界面”)。

-num pattern

转至输入字段 num(从 0 开始计数),并查找 pattern

-P path

在预生成交叉引用文件中的相关文件名前面添加 path,这样便无需更改为已生成交叉引用的目录。此选项只对 -d 选项有效。

-p n

显示最后 n 个文件路径组成部分而非缺省值(1 个)。使用 0 将完全不显示文件名。

-s dir

dir 中查找其他源文件。如果在命令行中指定了源文件,则忽略此选项。

-T

仅使用前八个字符与 C 符号进行匹配。如果包含特殊字符而非句点 (.) 的正则表达式的最小长度大于八个字符,则不会匹配任何符号。

-U

不检查文件时间戳(假定未更改任何文件)。

-u

无条件地生成交叉引用文件(假定所有文件都已更改)。

-V

在屏幕上的第一行中输出 cscope 的版本号。

-I-p-T 选项也可以在 cscope.files 文件中。

Usage

请求初始搜索

交叉引用准备就绪后,cscope 将显示以下菜单:

Find this C symbol:
Find this global definition:
Find functions called by this function:
Find functions calling this function:
Find this text string:
Change this text string:
Find this egrep pattern:
Find this file:
Find files #including this file:

重复按 TAB 键移至所需输入字段,键入要搜索的文本,然后按 RETURN 键。

发出后续请求

如果搜索成功,可使用以下任何单字符命令:

1-9

编辑指定行号引用的文件。

SPACE

显示下一组匹配行。

+

显示下一组匹配行。

-

显示上一组匹配行。

^e

按顺序编辑显示的文件。

>

将显示的行列表附加至某个文件。

|

将所有行通过管道传送至某个 shell 命令。

在任何时候,也可使用以下单字符命令:

TAB

移至下一个输入字段。

RETURN

移至下一个输入字段。

^n

移至下一个输入字段。

^p

移至上一个输入字段。

^y

使用上次键入的文本进行搜索。

^b

移至上一个输入字段并搜索模式。

^f

移至下一个输入字段并搜索模式。

^c

搜索时在不区分/区分大小写之间切换。(不区分字母大小写时,搜索 FILE 将与 Filefile 匹配。)

^r

重新生成交叉引用。

!

启动交互式 shell(键入 ^d 可返回 cscope)。

^l

重画屏幕。

?

显示关于 cscope 命令的帮助信息。

^d

退出 cscope

注意:如果要搜索的文本的第一个字符与上述命令之一匹配,要先键入 \(反斜杠)对其进行转义。

以新文本替换旧文本

键入要更改的文本后,cscope 将提示输入新文本,然后将显示包含旧文本的行。使用以下单字符命令选择要更改的行:

1-9

标记要更改的行或去标记。

*

标记要更改的所有显示行或去标记。

SPACE

显示下一组行。

+

显示下一组行。

-

显示上一组行。

a

标记要更改的所有行。

^d

更改标记的行并退出。

ESCAPE

退出而不更改标记的行。

!

启动交互式 shell(键入 ^d 可返回 cscope)。

^l

重画屏幕。

?

显示关于 cscope 命令的帮助信息。

特殊键

如果您的终端有在 vi (1) 中使用的方向键,您可以使用它们围绕输入字段移动。可使用向上方向键移至上一个输入字段,而不必重复使用 TAB 键。如果您有 CLEARNEXTPREV 键,它们分别充当 ^l+- 命令。

面向行的界面

借助 -l 选项,您可以在面向屏幕的界面派不上用场的情况下(例如从面向屏幕的其他程序)使用 cscope。cscope 准备好接受输入行时,将以 >> 给出提示,开头是字段编号(从 0 开始计数),后面紧跟搜索模式,例如 1main 将查找 main 函数的定义。如果您只需要单一搜索,请使用 -L-num pattern 选项,而不要使用 -l 选项,此时您不会得到 >> 提示。对于 -lcscope 将输出引用行数。

cscope: 2 lines

对于找到的每个引用,cscope 都会输出一行,其中包括文件名、函数名、行号和行文本(由空格分隔),例如:

main.c main 161 main(argc, argv)

请注意,不会调用编辑器来显示单一引用,这与面向屏幕的界面不同。

您可以使用 r 命令重新生成数据库。当检测到文件结尾或者当输入行的第一个字符是 ^dq 时,cscope 会退出。

Environment Variables

EDITOR

首选编辑器,缺省值为 vi(1)。

INCLUDEDIRS

要从中搜索 #include 文件的目录的冒号分隔列表。

HOME

起始目录,在登录时自动设置。

SHELL

首选 shell,缺省值为 sh(1)。

SOURCEDIRS

要从中搜索其他源文件的目录的冒号分隔列表。

TERM

终端类型,必须是屏幕终端。

TERMINFO

终端信息目录全路径名。如果终端不在标准 terminfo 目录中,请参见 curses(3CURSES) 和 terminfo(4),了解如何编写自己的终端描述。

TMPDIR

临时文件目录,缺省值为 /var/tmp

VIEWER

首选文件显示程序 [例如 pg],它将覆盖 EDITOR(请参见上文)。

VPATH

冒号分隔的目录列表,每个目录下面具有相同的目录结构。如果设置了 VPATHcscope 将在指定目录中搜索源文件;如果未设置,cscope 将只在当前目录中搜索。

Files

cscope.files

包含 -I-p-T 选项以及源文件列表的缺省文件(由 -i 选项覆盖)。

cscope.out

符号交叉引用文件,如果无法在当前目录中创建,会将其放在起始目录中。

ncscope.out

在替换旧交叉引用之前包含新交叉引用的临时文件。

See also

《C 用户指南》。

Notes

cscope 可识别以下格式的函数定义:

fname blank ( args ) white arg_decs white {

其中:

fname

是函数名称

blank

是零个或多个空格或制表符,不包括换行符

args

是不包含 " 或换行符的任何字符串

white

是零个或多个空格、制表符或换行符

arg_decs

是零个或多个参数声明(arg_decs 可能包括注释和空格)

函数声明不必从一行开头开始。返回类型可能在函数名称前面;cscope 仍可识别声明。偏离这种格式的函数定义无法由 cscope 识别。

菜单选项 Find functions called by this function: 输入字段的搜索输出的 Function 列将只在行中显示调用的第一个函数,即对于以下函数:

 
e()
{
     return (f() + g());
}

显示内容是:

 
Functions called by this function: e

File Function Line
a.c  f    3 return(f() + g());

有时,可能无法识别函数定义或调用,原因是 #if 语句内包含大括号。同样,可能会将变量的使用错误地识别为定义。

会将预处理程序语句前面的 typedef 名称错误地识别为全局定义,例如:

 
LDFILE *
#if AR16WR

预处理程序语句也会阻止识别全局定义,例如:

 
char flag
#ifdef ALLOCATE_STORAGE
     = -1
#endif
;

会将函数内的函数声明错误地识别为函数调用,例如:

 
f()
{
     void g();
}

会错误地识别为对 g() 的调用。

cscope 可通过查找类关键字识别 C++ 类,但是无法识别 struct 也是一个类,所以无法识别结构中的内联成员函数定义。它也不认为 typedef 中存在类关键字,所以会将以下语句中的 X 错误地识别为定义:

typedef class X * Y;

它也无法识别运算符函数定义

 
Bool Feature::operator==(const Feature & other)
{
     ...
}