本节主要讲解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 警告提示的用法的更多相关文章
-
GCC警告提示错误“cc1:all warnings being treated as errors”
http://blog.csdn.net/zhangjs0322/article/details/25131787
-
【转】各个层次的gcc警告 #pragma GCC diagnostic ignored ";-Wunused-parameter"; --不错
原文网址:http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __ ...
-
GCC(警告.优化以及调试选项)
GCC(警告.优化以及调试选项) [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 预处 ...
-
各个层次的gcc警告
http://blog.csdn.net/lizzywu/article/details/9419145 各个层次的gcc警告从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attri ...
-
PHP去除Notice警告提示
最近刚接触PHP,开发过程中可能会遇到Notice: Use of undefined ……这样的警告提示,可能是代码写的不太规范, 有两种解决途径:关闭 PHP 提示的方法, 搜索php.ini:e ...
-
用Anko和Kotlin实现Android上的对话框和警告提示(KAD 24)
作者:Antonio Leiva 时间:Mar 9, 2017 原文链接:https://antonioleiva.com/dialogs-android-anko-kotlin/ 借助Builder ...
-
eclipse中去掉警告提示
有时候我们要去掉这些不必要的提示 下面我们来设置去掉这些警告提示
-
去除编译警告@SuppressWarnings注解用法详解(转)
使用:@SuppressWarnings(“”)@SuppressWarnings({})@SuppressWarnings(value={}) 编码时我们总会发现如下变量未被使用的警告提示: 上述代 ...
-
如何快速复制Windows警告提示消息对话框内容
凡是使用过计算机的朋友,都遇到过系统发出的警告提示消息对话框,如图所示. 哇!好长的一串英文错误警告,这要手写到什么时候呢?不!现在不用这么麻烦了. 你只要鼠标选中这个提示框Ctrl+C,然后打开你的 ...
随机推荐
-
Json-遍历
1.js遍历 var data=[{name:"a",age:12},{name:"b",age:11},{name:"c",age:13} ...
-
python-twisted系列(1)
前言: 这不是一个入门教程.而是知识点的梳理. 开胃图: 这是一个TCP server的“交互图”. reactor 它是Twisted事件处理的核心.包括一些处理网络通讯,线程和事件分派的接口. 一 ...
-
SQLServer2005,2000获取表结构:字段名、类型、长度、主键、非空、注释
SQLServer 2005 SELECT d.name N'TableName', d.xtype N'TableType', a.colorder N'ColumnIndex', a.name N ...
-
对于fmri的设计矩阵构造的一个很直观的解释-by 西南大学xulei教授
本程序意在解释这样几个问题:完整版代码在本文的最后. 1.实验的设计如何转换成设计矩阵? 2.设计矩阵的每列表示一个刺激条件,如何确定它们? 3.如何根据设计矩阵和每个体素的信号求得该体素对刺激的敏感 ...
-
(转载)OC学习篇之---Foundation框架中的NSObject对象
前一篇文章讲到了OC中的代理模式,而且前几篇文章就介绍了OC中的类相关知识,从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套a ...
-
Android4.2增加新键值
这里添加新的键值,不是毫无凭据凭空创造的一个键值, 而是根据kernel中检测到的按键值,然后转化为android所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Bro ...
-
cf C. Inna and Dima
http://codeforces.com/contest/374/problem/C 记忆化搜索,题意:求按照要求可以记过名字多少次,如果次数为无穷大,输出Poor Inna!,如果不经过一次输出P ...
-
javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法
前言 for,slice(0),concact() 在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝.如下图演示: 如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不 ...
-
ubuntu16.04 caffe 安装
所需环境 opencv3.x + cuda9.0 安装 caffe首先在你要安装的路径下 clone : git clone https://github.com/BVLC/caffe.git 进入 ...
-
(原创)Spice 网表范例
一.常规网表 Inverter .lib "D:\lib\l0040ll_v1p4_1r.lib" TT .param SUPPLY=.1V .param T=10ns .para ...