GCC警告选项例解.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GCC警告选项例解

GCC警告选项例解 程序员是追求完美的一族,即使是一般的程序员大多也都不想看到自己的程序中有甚至那么一点点的瑕疵。遇到任意一条编译器警告都坚决不放过。有人会说:我们可以使用比编译器更加严格的静态代码检查工具,如splint。 这个建议也很不错。不过lint工具使用起来较繁琐,有时候还需要记住一些特定符号并插入到你自己的代码中才行,门槛较高,这也让很多人止步于此。那么我 们就从此放弃么?不,如今的编译器做得都很好,它可以帮助我们的找到绝大多数可能出现问题的代码,前提是你要学会控制编译器去找到这些问题代码,而熟悉编译器的警告选项恰恰是体现控制力的好方法。当你可以自如控制编译器警告输出的时候,你就算是入道了,同时你对语言的理解也更进一步了。 有人说:我就是用一个-Wall选项就可以了,一般选手可以这么做,而且他可以不知道-Wall会跟踪哪些类型的问题;但是高级选手是不会只使用-Wall的,他会把每条警告都研究的很透彻,会在Makefile中列出他想让编译器输出哪些类型的警告以替代-Wall,他会屏蔽掉那些对他的代码毫无用处的警告(很可能他使用了编译器对语言的扩展功能),他会有个和编译器交流的过程。 俗话说:工欲善其事,必先利其器,一直在工作中使用GNU C编译器(以下简称GCC),这里对GCC的一些警告选项细致的分析,并列举几个简单的例子[注1]供分析参考。 1. -Wall集合警告选项 我们平时可能大多数情况只使用-Wall编译警告选项,实际上-Wall选项是一系列警告编译选项的集合。下面逐一分析这一集合中的各个选项: [-Wchar-subscripts] 如果数组使用char类型变量做为下标值的话,则发出警告。因为在某些平台上char可能默认为signed char,一旦溢出,就可能导致某些意外的结果。 e.g. /* test_signed_char.c */ #include int main () { ???????? char????c??????= 255; // 我们以为char是无符号的,其范围应该是[0,255] ???????? int????? i???????= 0; ???????? int????? a[256]; ???????? for (i = 0; i 256; i++) { ???????????????? a[i] = 1; ???????? } ???????? printf(%d\n, c); // 我们期待输出255 ???????? printf(%d\n, a[c]); // 我们期待输出1 ???????? printf(%d\n, a[255]); ???????? return 0; } gcc -Wchar-subscripts test_signed_char.c test_signed_char.c: In function `main: test_signed_char.c:13: warning: array subscript has?type?`char 其输出结果: -1 -4197476 1 从输出结果来看Solaris 9/gcc 3.2上char默认实现类型为signed char;在Windows XP/gcc-3.4.2上也是一样。 Windows上的输出结果: -1 16 (随机值) 1 [-Wcomment] 当/*出现在 /* ... */注释中,或者\出现在// ...注释结尾处时,使用-Wcomment会给出警告。不要小觑这些马虎代码,它很可能会影响程序的运行结果。如下面的例子: e.g. /* * test_comment.c * gcc -Wcomment test_comment.c */ #include int main() { ???????? int????? a??????? = 1; ???????? int????? b??????? = 2; ???????? int????? c??????? = 0; // ok just test\ ???????? c = a + b; ???????? /* ????????? * 这里我们期待c = 3 ????????? * /* 但实际上输出c = 0 ????????? */ ???????? printf(the c is %d\n, c); ???????? return 0; } gcc -Wcomment test_comment.c test_comment.c:10:30: warning: multi-line comment test_comment.c:15:12: warning: /* within comment 输出: the c i

您可能关注的文档

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档