如何显示函数开始、结束行和函数体?

How to display function starting, ending line and function body?

本文关键字:结束 函数体 开始 函数 何显示 显示      更新时间:2023-10-16

假设我有一个字典,里面有几个文件.cpp其中定义了一些C++函数。

示例:文件.cpp

int sum(int a, int b) {
return a + b;
}
void display(int a){
cout << a;}
int square(int a) {
return a * a;
}

我的问题由两部分组成:

  1. 如何打印出特定功能的开始和结束行?
  2. 如何打印出整个函数体?

我想写一个 bash 脚本。

假设我想搜索函数总和。

期望输出:

Function sum is defined between lines 1 and 3.
int sum(int a, int b) {
return a + b;
}

迄今取得的进展:

grep -rin --include=*.cpp -ri "sum" | cut -d: -f2

上面的命令打印函数总和的起始行号,即在我的例子中是第 1 行。

C++不是你可以轻松解析的东西。 例如,此代码:

int func(a::b<c>d);

你不能说它是一个声明(命名空间ab模板化类的实例d(还是表达式(如果你ba的静态成员与c进行比较,然后是与d的比较的结果(,而无需解析标头和声明。

现在,让我们将其拆分为多行:

int func(a::
b<c>
d, 
e f);

起跑线是什么?

也:

int func(a::b<c, d> g, e<f>);

您将在此处看到,在后一种情况下,搜索逗号的正则表达式将失败,因为您将触发d作为参数(或者更糟的是,d >作为类型(。 您可以拥有多个级别的嵌入式模板,因此您需要在正则表达式中进行反向查找来解决此问题。

最后,你最终会(重新(编写编译器的前端,这是一项非常复杂的任务。

所以要回答你的问题,你不能在 bash 中做到这一点(恕我直言(。 如果我是你,我会在这里使用 clang 并让它为你查找和提取函数签名,并可能找到函数的行首和行尾。 如果,我猜,你的目的是提供代码完成,那么这里有一个用法示例:

clang -fsyntax-only -Xclang -code-completion-macros -Xclang -code-completion-patterns -Xclang -code-completion-brief-comments -Xclang -code-completion-at=file:line:col <clang-build-options here> <file>