转自GCC 警告提示的用法

本节主要讲解GCC的警告提示功能。GCC包含完整的出错检查和警告提示功能,它们可以帮助Linux程序员写出更加专业和优美的代码。我们千万不能小瞧这些警告信息,在很多情况下,含有警告信息的代码往往会有意想不到的运行结果。

首先可以先看一下以下这段代码:

#include<stdio.h>

void main(void)

{

long long tmp = 1;

printf("This is a bad code!\n");

}

虽然这段代码运行的结果是正确的,但还有以下问题。

?         main函数的返回值被声明为void,但实际上应该是int。

?         使用了GNU语法扩展,即使用long
long来声明64位整数,不符合ANSI/ISO
C语言标准。

?         main函数在终止前没有调用return语句。

GCC的警告提示选项有很多种类型,主要可分为“-Wall”类非“-Wall”类。

1.         Wall类警告提示

这一类警告提示选项占了GCC警告选项的90%以上,它不仅包含打开所有警告等功能,还可以单独对常见错误分别指定警告,这些常见的警告选项如下表所示(这些选项可供读者在实际操作时查阅使用)。

选项                                                    作用

-Wall                           打开所有类型语法警告,建议读者养成使用该选项的习惯

-Wchar-subscripts                如果数组使用char类型变量做为下标值的话,则发出警告。因为

在某些平台上可能默认为signed char,一旦溢出,就可能导致某

些意外的结果

-Wcomment                      当'/*'出现在'/*...*/'注释中,或者'\'出现在'//...'注释结尾处时,

使用-Wcomment会给出警告,它很可能会影响程序的运行结果

-Wformat                        检查printf和scanf等格式化输入输出函数的格式字符串与参数类

型的匹配情况,如果发现不匹配则发出警告。某些时候格式字符串

与参数类型的不匹配会导致程序运行错误,所以这是个很有用的警告选项

-Wimplicit                        该警告选项实际上是-Wimplicit-int和-Wimplicit-function-declaration

两个警告选项的集合。前者在声明函数却未指明函数返回类型时给出

警告,后者则是在函数声明前调用该函数时给出警告

-Wmissing-braces             当聚合类型或者数组变量的初始化表达式没有充分用括号{}括起时,给出警告

-Wparentheses                这是一个很有用的警告选项,它能帮助用户从那些看起来语法正确但却由于操

作符优先级或者代码结构“障眼”而导致错误运行的代码中解脱出来

-Wsequence-point             关于顺序点(sequence
point),在C标准中有解释,不过很晦涩。我

们在平时编码中尽量避免写出与实现相关、受实现影响的代码便

是了。而-Wsequence-point选项恰恰可以帮我们这个忙,它可以帮我们

查出这样的代码来,并给出其警告

-Wswitch                        这个选项的功能浅显易懂,通过文字描述也可以清晰地说明。

当以一个枚举类型(enum)作为switch语句的索引时但却没有

处理default情况,或者没有处理所有枚举类型定义范围内的情况

时,该选项会给出警告

-Wunused-function               警告存在一个未使用的static函数的定义或者存在一个只声明却未定

义的static函数

-Wunused-label                 用来警告存在一个使用了却未定义或者存在一个定义了却未使用的label

-Wunused-variable              用来警告存在一个定义了却未使用的局部变量或者非常量static变量

-Wunused-value                 用来警告一个显式计算表达式的结果未被使用

-Wunused-parameter            用来警告一个函数的参数在函数的实现中并未被用到

-Wuninitialized                  该警告选项用于检查一个局部自动变量在使用之前是否已经初始化了

longjmp                        调用可能修改一个non-volatile
automatic variable时给出警告

这些警告提示读者可以根据自己的不同情况进行相应的选择,这里最为常用的是”-Wall”,上面的这一小段程序使用该警告提示后的结果是:

[root@ft charpter2]# gcc -Wall wrong.c -o wrong

wrong.c:4:warning:return type of'main'is not'int'

wrong.c:In function'main':

wrong.c:5:warning:unused variable'tmp'

可以看出,使用”-Wall”选项找出了未使用的变量tmp以及返回值的问题,但没有找出无效数据类型的错误

2.         非Wall类警告提示

非Wall类的警告提示中最为常用的有以下两种:“-ansi”“-pedantic”

(1)“-ansi”

该选项强制GCC生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSI
C标准的
。使用该选项的运行结果如下所示:

[root@ft charpter2]# gcc -ansi wrong.c -o wrong

wrong.c:In function'main':

wrong.c:4:warning:return type of'main'is not'int'

可以看出,该选项并没有发现“long long”这个无效数据类型的错误。

(2)“-pedantic”

该选项允许发出ANSI C标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSI
C标准的。
使用该选项的运行结果如下所示:

[root@ft charpter2]# gcc -pedantic wrong.c -o wrong

wrong.c:In function'main':

wrong.c:5:warning:ISO C90 does not support'long long'

wrong.c:4:warning:return type of'main'is not'int'

可以看出,使用该选项查看出了“long long”这个无效数据类型的错误。

GCC 警告提示的用法的更多相关文章

  1. GCC警告提示错误“cc1:all warnings being treated as errors”

    http://blog.csdn.net/zhangjs0322/article/details/25131787

  2. 【转】各个层次的gcc警告 #pragma GCC diagnostic ignored "-Wunused-parameter" --不错

    原文网址:http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __ ...

  3. GCC(警告.优化以及调试选项)

    GCC(警告.优化以及调试选项) [介绍] gcc and g++分别是gnu的c & c++编译器   gcc/g++在执行编译工作的时候,总共需要4步   1.预处理,生成.i的文件 预处 ...

  4. 各个层次的gcc警告

    http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attri ...

  5. PHP去除Notice警告提示

    最近刚接触PHP,开发过程中可能会遇到Notice: Use of undefined ……这样的警告提示,可能是代码写的不太规范, 有两种解决途径:关闭 PHP 提示的方法, 搜索php.ini:e ...

  6. 用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)

    作者:Antonio Leiva 时间:Mar 9, 2017 原文链接:https://antonioleiva.com/dialogs-android-anko-kotlin/ 借助Builder ...

  7. eclipse中去掉警告提示

    有时候我们要去掉这些不必要的提示 下面我们来设置去掉这些警告提示

  8. 去除编译警告@SuppressWarnings注解用法详解(转)

    使用:@SuppressWarnings(“”)@SuppressWarnings({})@SuppressWarnings(value={}) 编码时我们总会发现如下变量未被使用的警告提示: 上述代 ...

  9. 如何快速复制Windows警告提示消息对话框内容

    凡是使用过计算机的朋友,都遇到过系统发出的警告提示消息对话框,如图所示. 哇!好长的一串英文错误警告,这要手写到什么时候呢?不!现在不用这么麻烦了. 你只要鼠标选中这个提示框Ctrl+C,然后打开你的 ...

随机推荐

  1. job interview

    一 , 7series clock 二, SDRAM comtroller (DDR) 4.熟悉DDR2/3协议或Ethernet相关协议,并有实际项目经验者优先: 三,AXI bus(AMBA) 四 ...

  2. 【转】ArrayList的toArray,也就是list.toArray[new String[list.size()]];,即List转为数组

    [转]ArrayList的toArray ArrayList提供了一个将List转为数组的一个非常方便的方法toArray.toArray有两个重载的方法: 1.list.toArray(); 2.l ...

  3. 对象创建型模式------Abstract Factory(抽象工厂)

    1. 意图    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.2. 别名    Kit3. 动机        假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 ...

  4. 启发式搜索 A*算法的OC 实现

    前两天重新学习了下A*算法,上次学习A*算法已经是5年前了,看到网上铺天盖地的A*算法都是C.C++等等其他语言的,就是没有OC 的,所以抽空写了一份.今天太晚了就不说明A*算法的细节了,大家如果想学 ...

  5. [leetcode]最长递增序列

    class Solution { public: int lengthOfLIS(vector<int>& nums) { int n=nums.size(); ) ; vecto ...

  6. [leetcode] 399. Evaluate Division

    我是链接 看到这道题,2个点和一个权值,然后想到图,但是leetcode就是这样,没给数据范围,感觉写起来很费劲,然后就开始用图来做,添加边的时候,注意正向边和反向变,然后查询的时候,先判断2个点是否 ...

  7. bzoj2748:[HAOI2012]音量调节

    思路:刷水有益健康. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  8. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  9. 【转】mysql in语句优化

    mysql会对sql语句做优化, in 后面的条件不超过一定数量仍然会使用索引.mysql 会根据索引长度和in后面条件数量判断是否使用索引. 另外,如果是in后面是子查询,则不会使用索引. 一个文章 ...

  10. JS到PHP使用RSA算法进行加密通讯

    我们平时做用户登录表单提交,用户名密码都是明文直接POST到后端,这样很容易被别人从监听到. 在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑 ...