如何从头声明中找到源代码?

时间:2011-12-02 07:23:02

标签: c++ c linux emacs

我想浏览/ usr / include /中头文件中符号的源代码。例如,在netdb.h中,有一个名为getaddrinfo(...)的函数。我想知道至少通过使用shell来存储源代码的位置。

如果你告诉我如何在Emacs和/或Cscope中专门做这件事,我将不胜感激。

7 个答案:

答案 0 :(得分:3)

标准C库函数的定义(带有函数体)是GNU Libc内的(通常在Linux上)。几个函数(syscalls的手册页的第2节中的那些函数,<asm/unistd.h>中列出的系统调用号)是system calls的小包装,因此实际工作在{{3}内完成其来源位于linux kernel。例如,kernel.org是一个系统调用(主要在内核中完成),可以由write(2)库函数(其代码在GNU Libc中)使用。您可以安装GNU Libc源代码并使用ctags在那里查找符号。

标准C库函数的声明位于/usr/include下的头文件中,因此 ctags 等实用程序可以帮助您找到它们。

答案 1 :(得分:2)

您可以使用 c-tags

C-] - 转到定义
C-T - 从定义中跳回来 C-W C-] - 在水平拆分中打开定义

答案 2 :(得分:2)

如果您计划在Emacs中使用cscope,请查看以下文本(来自xcscope.el)。

* Keybindings:

All keybindings use the "C-c s" prefix, but are usable only while
editing a source file, or in the cscope results buffer:

    C-c s s         Find symbol.
    C-c s d         Find global definition.
    C-c s g         Find global definition (alternate binding).
    C-c s G         Find global definition without prompting.
    C-c s c         Find functions calling a function.
    C-c s C         Find called functions (list functions called from a function).
    C-c s t         Find text string.
    C-c s e         Find egrep pattern.
    C-c s f         Find a file.
    C-c s i         Find files #including a file.

您可以在该文件中找到更多信息。以下链接也可能有所帮助:

在使用Cscope查找符号之前,应首先在代码库的根目录下按C-c s I创建索引,例如,名为foo的文件夹。然后将生成两个文件。 Cscope将以递归方式查找foo中包含的所有源文件,并创建一个名为cscope.files的列表。然后,它将使用此列表为每个文件中的所有符号创建索引,并将此信息存储在文件cscope.out中。之后,只需按foo将cscope的初始目录设置为C-c s a,告诉Cscope在哪里找到cscope.out。然后上面提到的键绑定应该有效。

答案 3 :(得分:1)

如前所述,您可以使用etags为指定的标签生成标签 源。

find /usr/include/ -type f -name \*.h -exec etags --append -o INCLUDE_TAGS {\} \;

这将创建一个名为INCLUDE_TAGS的文件,其中包含 位于标题中的每个定义的位置 /usr/include/

然后您可以将它与 M - 一起使用,当它询问时 对于TAGS文件,请使用INCLUDE_TAGS。第一次需要一些时间 时间,但在它快速之后。

但是你只是跳转到标题中的定义而不是 来源,如果你想这样做,你将不得不下载源和 生成TAGS。

答案 4 :(得分:1)

很奇怪没有人提到它,但是...为了查看 源代码,你必须拥有它。在大多数Unices(除了Linux之外),等等 来源是专有的;要访问它们,你需要一个特殊的 许可证,或为公司工作。在Linux的情况下,来源是 公开可用,但通常不会安装在计算机上。如果 这是你的机器,你有用于安装系统的DVD, 来源应该在它上面,通常在一个单独的包中。如果你不这样做 安装DVD,或者无法在系统上安装软件包 (大多数人专业使用Linux的情况),你必须这样做 从某个地方的互联网下载它们。

答案 5 :(得分:0)

更新的方法是遵循this guide中包含几种跳转源树的方法的方法,并使用包含数十万个文件的大型项目。

答案 6 :(得分:0)

如果您正在使用emacs和etags,则可以制作包含标头声明的TAGS文件。

$> etags -e -L {file_list} --c-kind = + px

p表示原型,x表示外部变量。

然后您可以在标头中看到功能定义和原型定义,以击中M-。

最近的emacs具有外部参照功能,因此外部参照-查找-定义将在标头中显示2行用于定义和原型。