继续收集gcc一些编译警告
2015-10-20 22:36
309 查看
大约半年前,写了篇关于gcc编译警告的文章《gcc较高版本的一些编译警告收集》,因为忍受不了当时做的项目的刷屏式的编译警告。没想到,现在又要进行此事。因为当前的代码分支实在太多,而且又各自为政,没法通用——与当初重构的初衷已背离,当然,这是架构师要做的事,即使公司现在正在推行“匠心精神”,我还是没权力和能力想去推架构。所以,注定是一个修正几年前代码遗留warning的小弟。在修正过程中,真正认为到代码编写的重要性。这份庞大的代码我只贡献不到2%吧,但还是好好总结一下,以免自己日后再犯。
在写之前,实然想到一个未定义行为的语句事件,它就是年初遇到的问题,当时曲线解决的,在文章《遇到一个gcc编译器版本导致的运行结果有差异的问题》中提到。这个事件实质是对同一变量在同一语句中进行2次操作造成的,类似于大学试卷喜欢出的i = i+++i++这种。幸好,修改警告后,在设备上验证的结果和原来的一致,如果不一致,涉及到上位机的修改,那就更麻烦了。
1、调试语句的警告
警告:
问题出现在&&上。其实代码意图很简单,就是打印信息同时把行号、函数打印出来。可能因为行码太过匆忙,就出现上述这样的代码了。修改很简单,如下:
同时是调试语句,警告如下:
出错示例代码:
2、类型匹配
警告:
3、变量未初始化
警告:
原因是mode在声明时没有初始化,但后面有条件地被赋值,不满足所有情况,编译器报警告。
比如:
4、其它
警告:
警告:
总结:干一行爱一行,既然选择一个写代码的人,就认真对待吧。不为他人,为的是现在的你不让以后的你掉坑。(可惜我一直在坑里)
李迟 2015.10.20 周二 晚上
在写之前,实然想到一个未定义行为的语句事件,它就是年初遇到的问题,当时曲线解决的,在文章《遇到一个gcc编译器版本导致的运行结果有差异的问题》中提到。这个事件实质是对同一变量在同一语句中进行2次操作造成的,类似于大学试卷喜欢出的i = i+++i++这种。幸好,修改警告后,在设备上验证的结果和原来的一致,如果不一致,涉及到上位机的修改,那就更麻烦了。
1、调试语句的警告
警告:
warning: value computed is not used出错示例代码:
#define LL_DEBUG printf("[%s-%s:%d]", __FILE__,__FUNCTION__, __LINE__) && printf//LEVEL_PRINT("[%s:%d]", __FILE__, __LINE__) && LEVEL_PRINT
问题出现在&&上。其实代码意图很简单,就是打印信息同时把行号、函数打印出来。可能因为行码太过匆忙,就出现上述这样的代码了。修改很简单,如下:
#define LL_DEBUG(fmt, ...) printf("[%s-%s:%d]" fmt, __FILE__,__FUNCTION__, __LINE__, ##__VA_ARGS__)瞬间人感觉正常了。
同时是调试语句,警告如下:
warning: statement has no effect [-Wunused-value]
出错示例代码:
#if 0 #define LL_DEBUG printf #else #define LL_DEBUG #endif这样的语句肯定不行的。修正:
#if 0 #define LL_DEBUG(fmt, ...) printf(fmt, ##__VA_ARGS__) #else #define LL_DEBUG(fmt, ...) #endif
2、类型匹配
警告:
warning: format '%d' expects type 'int*', but argument 6 has type 'unsigned short*'unsigned short和%d不匹配。用%hu来修正,示例: sscanf("test: 250", "test: %hu", &uWord);。下面从一些参考资料上获取并验证的:
short: %hd unsigned short: %hu unsigned int: %u unsigned long long: %llu
3、变量未初始化
警告:
warning: 'mode' may be used uninitialized in this function
原因是mode在声明时没有初始化,但后面有条件地被赋值,不满足所有情况,编译器报警告。
比如:
int mode; if (idx > 1) { mode = 1; } int set = mode;假如idx小于1,mode就不会被赋值,set的值就是未知的了(看编译器)。
4、其它
警告:
warning: backslash and newline separated by space宏后面使用“\”来连接多行,但“\”后面多了空格,删除空格即可。
警告:
warning: "/*" within comment [-Wcomment]在“/***/”中还有“/*”,有这个警告,我会认为写代码的人细心度不够,写代码如行云流水。呵呵。
总结:干一行爱一行,既然选择一个写代码的人,就认真对待吧。不为他人,为的是现在的你不让以后的你掉坑。(可惜我一直在坑里)
李迟 2015.10.20 周二 晚上
相关文章推荐
- iOS CoreData_基本表的增加
- Android 自定义视图 onMeasure,MeasureSpec 思路详解
- LeetCode43——Multiply Strings
- 转:OSI七层协议与TCP/IP四层协议之间的比较(学习中)
- 带你走进EJB--那些跟EJB容器相关的那些Java概念
- 类是如何定义出来的
- 黑马程序员-----集合 泛型
- Android中的样式
- 60s经济学
- 大数据技术——Storm
- 关于今晚的实验 自己做出来的 满满的成就感感觉自己棒棒哒
- Android-----手势识别GestureDetector
- win+Apache+mod_wsgi部署python程序-apache2.2+python2.7
- view 与viewGroup的关系
- Ubuntu环境下安装Bochs
- Android Studio导入library project第三方类库
- 【Alpha】第一次Scrum Meeting
- Ubuntu环境下安装Bochs
- MySQL数据库ab不同步2种情况及解决过程
- 实践自己的WebSite______流水