source insight 中c++ 返回类型后置定义函数解析失败问题

source insight 中c++ 返回类型后置定义函数解析失败问题,第1张

事情起源于在看mtk camera代码的时候,source insight始终无法正常解析一些函数,例如:

 可以看到函数名没有加粗,函数体内部变量也是乱七八糟,一旁的符号表更是一塌糊涂:

但同时又有一些函数可以被正常parse:

这给阅读复杂的源码造成了不小的麻烦

于是仔细阅读书写方式,产生了两个疑问:

1.会不会是命名空间造成的混乱?

2.函数后面的->没见过,是什么作用?

带着两个疑问去继续阅读代码,首先尝试解决1号疑问,我做了以下尝试:

a.文件的开头有这样的定义:

和aosp惯例的写法似乎有所不同,随便拉一个出来看看,果然:

于是把写法统一成aosp风格试试,结论是没有用

b.那么尝试把namespace的影响直接去掉呢:

 还是没用

c.又回到这里,这个namespace 的宏有什么作用?感觉无法提高任何可读性,会是这个宏定义导致的解析出错吗,删除试试

结论是依旧没有作用

至此针对疑问1的措施已经尝试完了,没有解决问题,尝试通过解答疑问2来解决:

首先要知道函数后面的->是什么作用?

这种写法被称作函数声明的返回类型后置写法

我们定义一个函数通常会这样写:

int add(int a, int b) {
    return a + b;
}

而在c++ 11 中,也可以通过下面的语法来定义一个函数:

auto add(int a, int b) -> int {
    return a + b;
}

这样的定义方式就称为返回类型后置的写法

那么把这个写法改成一般的写法可行吗

答案是可行:

可以看到函数名被正确解析,函数体内的解析也正常

那么为什么这些函数都是采用返回类型后置的写法,有的不用修改就能正确解析而有的就不行?

回到代码中:

同样都是采用返回类型后置写法,又看了同文件的其他函数定义,发现只有返回值不为一般关键字的时候parse会有问题(比如返回值为::android::status_t)

根据这个发现,尝试删除或者修改返回值:

可以看到删除/修改返回值,都可以正常解析了,所以返回类型后置本身没有什么问题,是::android::status_t这个返回值让source insight没有解析出来

至于source insight为什么没有解析出::android::status_t,尝试添加了status_t的定义文件

\system\core\include\utils\Errors.h也仍无法解决

于是现在想要正常解析返回值为::android::status_t的后置返回类型函数只能采取以下的方法:

1.临时改写成普通定义方式

2.临时删除/修改返回值

参考

) in function heading - Stack Overflow">c++ - Arrow operator (->) in function heading - Stack Overflow

扩展知识:

为什么要使用后置返回类型的函数定义法?

这就要学习泛型编程的相关知识了,关于泛型我属于是求也不懂,可以参考这篇文章,写得很详细:

C++返回值类型后置(跟踪返回值类型)

简单的说就是为了配合decltype关键字来简化返回值类型的推导

那么上文中提到的这个定义并没有涉及泛型,这样写有什么必要呢

我的答案是没有必要,并且一定程度上降低了可读性,如果哪位懂这样写的必要,一定要来骂醒我,谢谢。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/707157.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存