事情起源于在看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关键字来简化返回值类型的推导
那么上文中提到的这个定义并没有涉及泛型,这样写有什么必要呢
我的答案是没有必要,并且一定程度上降低了可读性,如果哪位懂这样写的必要,一定要来骂醒我,谢谢。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)