前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >问题解决:一次进 “源码” 排错的经历,学到了

问题解决:一次进 “源码” 排错的经历,学到了

作者头像
看、未来
发布2021-12-01 10:03:15
2500
发布2021-12-01 10:03:15
举报
文章被收录于专栏:CSDN搜“看,未来”

毕设用到了protobuf,所以花一天时间学了一下并上手使用。

一通操作下来,报了个错:expected unqualified-id before ‘(’ token。

在这里插入图片描述
在这里插入图片描述

定位在 XX.pb.h 文件中,心里发怵,这不是自动生成的吗?那个文件我去看过,有点乱,要我动手,有点。。。

在1.0版本向1.1版本进发的过程中,就是这个bug让我搁置了将JSON替换成PB的进度,那会儿急,现在无所谓,闲得很,干它!

于是我循迹找到那个报错的地方:

在这里插入图片描述
在这里插入图片描述

其实我很少使用 文本find功能(可能是以前遇到的bug不值得让我放这个大招吧),这次迫不得已,还是养成这个好习惯吧。

问题很明显了吧!!!明显就看不出有什么不对啊。。。

还好,前人已经踩过这个坑了,我顺着他的路子自己走了一遍,拿到这个经验。

1、把这个报错的代码删了,去 .cc 文件里面 find 一下就知道这个函数根本没有什么依赖性,直接删掉,编译,正常!!! 一般人到这一步就可以了,该干其他的事情,或者下班了。

2、恢复原样,将该函数名进行修改(第一步无奈之下很容易想到,第二步就需要经验了)。就不觉得这个函数名很常见吗?而且这个函数内容只不过是一个转调用,招谁惹谁了???如果是被转调的函数出问题,报错就不是在这个函数里了。最后,翻译一下那个报错,但凡英语好一点。 综上,决定修改一下函数名试一下看看能不能过。 修改函数名,这里有个细节,这里只是实现,前面还有声明,在 find 的时候会看到(果然不 find 不行啊)。 修改之后,编译,正常!!! 保守派到这里也就可以了,那个函数没有给 .cc文件使用,那可能就是要给开发者用的嘛。贸然删除了不好,这下就保有了代码原有的功能不残缺。

3、但是作为探索者,应该再往下一步。为什么使用 errno 这个名字会不行呢?不符合预期?怎么个不符合预期?想到这个errno,眼熟吧, errno.h 里面也有。但是有又怎么了?

使用预编绎工具,把代码做下预编绎处理,使用g++ -E 的方法,把出问题的.cpp进行处理,看看里面长什么样子。

代码语言:javascript
复制
g++ -E prototest.pb.cc -lprotobuf >test.i

找到大致问题所在的地方,我们发现,在定义到errno()函数的地方,被动了手脚了。如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

究其原因,因为在编译的时候引入了 errno.h

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档