使用bash查找函数的声明和定义

时间:2010-03-13 16:33:20

标签: bash

我正在查看一个包含100多个文件的大型C ++项目。给定一个函数名称,如何找到只使用bash工具如find或grep,声明和函数的定义?

由于

5 个答案:

答案 0 :(得分:13)

尝试ack,这比grep更好。颜色突出,作品......

$ ack funcion_name

打印出通过源文件递归搜索function_name的所有用法,它也足够聪明,可以忽略.svn和其他元数据

答案 1 :(得分:4)

我认为,最可靠的方法是为此使用专用工具,而不是使用grepack或该顺序的任何东西。总是有可能以最难以想象的方式将定义分布在多行上。前面提到的工具将很容易为以下功能返回所需的信息:

int f(int a) { return 2; }
int g(a,b,c,d) int a,b,c,d; { return 2; }

,但是当您的来源更加混乱时,它们将无法提供完整的值:

int f ( // declares a function
        // this function is going to be awesome      
        int a  // first variable
      ) { return 2; }

您可能应该使用ctags

答案 2 :(得分:3)

在最简单的情况下,

grep -ER '^.*(.*);' file  #find declaration.

至于定义,如果你想获得整个定义,它有点棘手。 (即从打开括号到关闭)。您可能希望使用示例C ++文件

来显示您想要获得的内容

答案 3 :(得分:2)

如果你有一个函数定义从一行的开头开始的约定,那么你可以使用:

find . -exec egrep '^fn' '{}' ';' >/dev/null -print

如果要限制标题,可以在-exec

之前添加-name * .h

请注意,如果您想要做很多事情,请查看“标签”,并与朋友保持最新的索引,以便将来更快。

答案 4 :(得分:2)

我知道这个问题太老了,我发现@ ghostdog74的答案非常有趣,但他忘了回答如何找到函数的定义。

受到@ ghostdog74的启发,我认为这可能是一个很好的方法:

grep -Hnre '^.*fct_return.*fct_name.*(.*).*{

它只是说,抓住一切从开始直到你找到fct_return,然后发现任何东西,直到它找到fct_name左括号“(”然后任何东西,直到它找到右括号“)然后直到找到“{”