3、致的分析,并列举几个简单的例子[注1]供分析参考。1.-Wall集合警告选项我们平时可能大多数情况只使用-Wall编译警告选项,实际上-Wall选项是一系列警告编译选项的集合。下面逐一分析这一集合中的各个选项:[-Wchar-subscripts]如果数组使用char类型变量做为下标值的话,则发出警告。因为在某些平台上char可能默认为signedchar,一旦溢出,就可能导致某些意外的结果。e.g./*test_signed_char.c*/#includeintmain(){ char c =255;//我们以为char
4、是无符号的,其范围应该是[0,255] int i =0; int a[256]; for(i=0;i<256;i++){ a[i]=1; } printf("%d",c);//我们期待输出255 printf("%d",a[c]);//我们期待输出1 printf("%d",a[255]); return0;}gcc-Wchar-subscriptstest_signed_
5、char.ctest_signed_char.c:Infunction`main':test_signed_char.c:13:warning:arraysubscripthas type `char'其输出结果:-1-41974761从输出结果来看Solaris9/gcc3.2上char默认实现类型为signedchar;在WindowsXP/gcc-3.4.2上也是一样。Windows上的输出结果:-116(随机值)1[-Wcomment]当'/*'出现在'/*...*/'注释中,或者''出现在'//...'注释结尾处时,使用-Wcomment会给
6、出警告。不要小觑这些马虎代码,它很可能会影响程序的运行结果。如下面的例子:e.g./**test_comment.c*gcc-Wcommenttest_comment.c*/#includeintmain(){ int a =1; int b =2; int c =0;//okjusttest c=a+b; /* *这里我们期待c=3 */*但实际上输出c=0 */