我正在查看一个包含100多个文件的大型C ++项目。给定一个函数名称,如何找到只使用bash工具如find或grep,声明和函数的定义?
由于
答案 0 :(得分:13)
尝试ack,这比grep更好。颜色突出,作品......
$ ack funcion_name
打印出通过源文件递归搜索function_name的所有用法,它也足够聪明,可以忽略.svn和其他元数据
答案 1 :(得分:4)
我认为,最可靠的方法是为此使用专用工具,而不是使用grep
,ack
或该顺序的任何东西。总是有可能以最难以想象的方式将定义分布在多行上。前面提到的工具将很容易为以下功能返回所需的信息:
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
左括号“(”然后任何东西,直到它找到右括号“)然后直到找到“{”