c++ 查找函数定义的位置 IDE跳转 或 正则表达式匹配

c++ 找到函数定义的位置 用 IDE跳转 或者 正则表达式匹配

读源码的时候,如果要找到一个函数在哪里定义的,在Python或者Fortran里头是很好找的,因为

  • Python有关键字def, 直接查找 def functionName( 就可以找到函数定义的地方
  • Fortran有关键字subroutine或者function, 直接查找subroutine xxname或者function xxname就能找到

但是,在C++/C里头,函数定义的地方并没有一个特定的关键字表示这里要定义一个函数,

寻找函数定义的地方,可以这样:

  1. 如果有强大的 IDE, 比如 VSCode, 可以直接利用 IDE 的功能跳转到函数定义的位置,https://www.cnblogs.com/star-meteor/p/12712315.html
    1.1 光标定位到函数位置,按住 control 之后点击函数,跳转到定义的地方
    1.2 跳转回原来的地方 用 ALT + 向左键
  2. 可以用正则表达式匹配的方式来查找,
函数定义的地方,最主要的特点是小括号里头括着参数名,然后小括号后面紧跟大括号,用来包裹函数定义的代码块

根据这个特征,我目前想到的最强大的匹配方式是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?\{, 于是,这一下几乎可以精确匹配到所有函数定义的地方了!
当然,大家还可以根据具体情况灵活匹配

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值