问题解决:一次进 “源码” 排错的经历,学到了
毕设用到了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进行处理,看看里面长什么样子。
g++ -E prototest.pb.cc -lprotobuf >test.i
找到大致问题所在的地方,我们发现,在定义到errno()函数的地方,被动了手脚了。如下图所示:
究其原因,因为在编译的时候引入了 errno.h
相关文章
- 深入理解C++中的异常处理机制
- Teradata天睿公司推出无处不在数据智能平台Teradata Vantage助力企业随时分析所有数据
- 大数据干货 | 论Spark高手是怎样炼成的
- Cloudera和Hortonworks宣布合并:对Hadoop的一记重创!
- 在Ubuntu下搭建ASP.NET 5开发环境
- 使用RxJava从多个数据源获取数据
- Teradata天睿公司:超越分析直通成果
- 技术分享:Hadoop框架
- 编程赚钱的7个方法
- 干货 :5种项目助你找到数据科学工作
- Java Executor 框架学习总结
- SQL Server 2005即将终止服务 你准备好了么?
- 初探:企业数据湖治理优秀实践!
- C语言初学者常见问题与错误
- 程序员的困境及如何摆脱这种困境?
- 大数据可视化工具圈里的春秋战国
- 这10本免费的机器学习和数据科学书籍,确定不看一下么?
- 用R语言分析与预测员工离职
- 2016年十大最热门 IT 职业岗位
- TalkingData林逸飞:以数据智能探索业务突破 企业需正视数字化三大短板