c++ 找到函数定义的位置 用 IDE跳转 或者 正则表达式匹配
读源码的时候,如果要找到一个函数在哪里定义的,在Python或者Fortran里头是很好找的,因为
- Python有关键字def, 直接查找
def functionName(
就可以找到函数定义的地方 - Fortran有关键字subroutine或者function, 直接查找
subroutine xxname
或者function xxname
就能找到
但是,在C++/C里头,函数定义的地方并没有一个特定的关键字表示这里要定义一个函数,
寻找函数定义的地方,可以这样:
- 如果有强大的 IDE, 比如 VSCode, 可以直接利用 IDE 的功能跳转到函数定义的位置,https://www.cnblogs.com/star-meteor/p/12712315.html
1.1 光标定位到函数位置,按住 control 之后点击函数,跳转到定义的地方
1.2 跳转回原来的地方 用 ALT + 向左键 - 可以用正则表达式匹配的方式来查找,
函数定义的地方,最主要的特点是小括号里头括着参数名,然后小括号后面紧跟大括号,用来包裹函数定义的代码块
根据这个特征,我目前想到的最强大的匹配方式是functionName\([^;]*\n?\)[^;\{]*\n?\{
,然后以下一步步展开介绍里面各个符号是怎么来的:
- 首先,最简单的匹配方式是搜索
functionName\(.*\) \{
, 其中小括号和大括号( ) { }
是特殊字符,前面加反斜杠\表示我们匹配的就是这个字符的纯文本版本,即\(
代表(
;而.
代表了除换行符\n
以外的所有字符,.*
表示.
的出现次数不定,因为代表了一连串未知的的字符, 可以匹配小括号里的所有内容。比如以下情况就可以被functionName\(.*\) \{
匹配到:
typeT functionName(int argsA, double argsB, ...) {
do_something();
}
- 且慢!上面的匹配方式没有考虑大括号换行的情况!比如:
typeT functionName(int argsA, double argsB, ...)
{
do_something();
}
又或者小括号和大括号之间有const的情况!(比如类的const成员函数),
typeT functionName(int argsA, double argsB, ...) const {
do_something();
}
我想到可以用[^;\{]*\n?
来匹配,其中,
\n?
表示换行符\n
可以出现0或1次,
[^;\{]*
中*
号代表前面的内容可以出现0次到n次,
[]
括起来的^;\{
表示一堆未知字符(比如const, 中间不包括换行符;
以及左大括号{
,所以用字符^
来排除换行符;
以及左大括号{
),
所以合起来就是用functionName\(.*\)[^;\{]*\n?\{
来匹配;
- 等一等!还有情况没有考虑到!比如,如果函数形参有换行怎么办呢?
.*
没有办法匹配换行的情况,比如以下情况:
typeT functionName(int argsA, double argsB, // 此处有换行
string argsC, int64_t argsD, ...) {
do_something();
}
typeT functionName( // 此处有换行
int argsA, double argsB, // 此处有换行
string argsC, int64_t argsD // 此处有换行
) {
do_something();
}
有换行的时候不能用.*
,
我想到了可以用[^;]*\n?
来匹配小括号里头的内容,其中的^
表示取非,即排除^
后面的内容。形参里面不会有换行符;
,就可以用[^;]*
来匹配小括号中所有形参的内容,加上\n?
表示形参里头可以换行。
因此,
匹配方式变成了 functionName\([^;]*\n?\)[^;\{]*\n?\{
, 于是,这一下几乎可以精确匹配到所有函数定义的地方了!
当然,大家还可以根据具体情况灵活匹配