对C语言中警告(warning)的处理方法

仅代表个人看法

如有侵权请联系删除

在用C语言编写的过程中,我们常常会看到警告提示

在了解警告之前,我们先了解一些概念

对于 VS、GCC、Xcode 等,如果代码没有错误,它们只会显示“生成成功”,不会显示“0个错误,0个警告”,只有代码真的出错了,它们才会显示具体的错误信息。

错误(Error)表示程序不正确,不能正常编译、链接或运行,必须要纠正。

警告(Warning)表示可能会发生错误(实际上未发生)或者代码不规范,但是程序能够正常运行。

错误和警告可能发生在编译、链接、运行的任何时候。

当编译程序系统对程序中某些地方有疑问,或有问题时会给出一个警告信息,他可能意味程序中隐含的某项错误,也有可能没有问题。对于警告的出现处理的方法是:对于不明的警告尽可能地消除,观察是否影响程序的运行。

程序的不同意味着警告也是多种多样,这里只举一些简单的例子,含有相对应的处理方法

1.      implicit declaration of function 'Example()'

         warning: type mismatch with previous implicit declaration

         warning: previous implicit declaration of 'Example()'

原因:

1、在你的.c文件或C++文件中调用了函数Example(),可是你并没有把声明这个函数的相应的.h文件包含进来。

2、你在一个.c文件中定义了这个函数体,但并没有在.h中进行声明。

方法:

1、你可以在调用这种函数的.c文件的一开始处加上:extern Example();

2、你可以在调用这种函数的.c文件中包含进声明了函数Example()的头文件。(如果你在一个.c文件中定义了这个函数体,但并没有在.h中进行声明,不嫌麻烦的话,你也可以去生成一个.h文件,加上你的函数声明。)

2、      unused variable 'param'。

原因:很明显,是您定义了变量‘param',却根本没有使用它。

方法:如果无用请删除,此程序影响正常运行

3、    statement with no effect。

原因:在文件中,你定义了#define MACROPRINT,然后在某一处又定义了#define MACROPRINT 。然后你在某处引用了MACROPRINT(“HELLO”),这样不会出错,但是发生了警告来说明“这个声明是没有用的”。

方法:把#define MACROPRINT删掉,属于定义混乱问题

4、   int format, long int arg 

        comparison between pointer and integer

原因: 像printf("%s%d, szDebugString, ulGwId)的警告,你的ulGwId是一个unsigned long型的,而你为它选择的输出形式却是 “%d”(这个格式是为整数型服务的-int)(%d为整型输出)。

方法: 把“%d”改成“%d”(即将参数改为一致)。

5、 comparison is always 0 due to limited range of data type

原因:1,定义了unsigned int uParam;但是又做了if(uparam<0)的判断,因为unsigned int型的数据总是>=0的,因此这样的比较由于数据类型限制了它的范围,因此也就给出了警告。

方法:可以去掉这样的判断,不过一般不影响程序的正常运行

6、    control reaches end of non-void function

         return' with no value, in function returning non-void

原因:1,你写了一个

unsigned long FuncA()

{

if()

{

return ulValue;

}

if ()

{

return ulValue;

}

}

的函数,而在两个if语句中,你都没有进入,这时,退出函数时,没有值可以返回。显示为错误

办法: 如果一个函数有返回值,确保在任何情况下该函数都有一个返回值。

7、    overflow in implicit constant conversion

原因:变量的变换有可能导致数值的越界。例如:

#define RET_PRODUCTID 0x10000000

#define ERR_RET_GLOBAL RET_PRODUCTID+5000

#define RET_USER ERR_RET_GLOBAL+5000

#define USER_OK RET_USER+0

#define USER_FAIL RET_USER+1

如果这样定义,碰到short Func(){return USER_OK}内容,就会警告有出现越界。

办法:确定值的范围,不要出现越界行为。

8、   ulParam' might be used uninitialized in this function

警告原因: 当ulParam做为表达式的值时,而在此之前,没有对这个参数进行初始化。

例如:

void Func()

{

ulong ulParam;

ulong ulRetCode;

if``(…)

{

ulParam = ……;

}

if``(….)

{

ulParam = ……;

}

ulRetCode = ulParam;

}

在这种情况下,当两个if()都执行不到的时候,ulParam根本没有被赋值过,这样又去给ulRetCode赋值,就比较危险了。

办法: 属于信息缺少,个人问题

9、      passing arg 1 of 'free' makes pointer from integer without a cast

            warning: assignment from incompatible pointer type

           warning: initialization from incompatible pointer type

           warning:passing arg 2 of 'AOS_MemCopy_X' makes pointer from integer without a c

原因: 你free(a),但a是一个unsigned long,你可能把一个指针的数值放在了a里面了。

办法: 在free(a)时,需要强制转换a为指针类型的即可。即:free((char*)a)。

10、     warning: 'MY_DEBUG' redefined

             warning: this is the location of the previous definition

原因: 连续出现这种两个警告,可能你在你的.c文件中包含了两个.h文件,而这两个.h文件都对MY_DEBUG进行了声明。

办法:只在一个文件中声明,删除其中一个声明

11、      value computed is not used

原因:参与运算的值是没有作用的。比如你这样干:

char* p;

*p++;

这样对p没有影响。

方法:请确定究竟要进行什么运算,不要让运算抵消。

12、     '#ifdef' argument starts with a digit

原因:出现了#ifdef 0这样的错误

方法:应是#if 0 ,个人错误

13、   unknown escape sequence '\R'

原因:编译器不认识‘\R'。

方法:一时笔误,应该是‘\r'。

14、  :too few arguments for format

原因:可能编写了:printf(“%d%s”,uParam);

方法:去掉无用的部分

15、   ‘Func' defined but not used

原因:Func 函数你定义了,但是你根本没有使用它。

方法:不要的就去掉,明白你要什么

16、  suggest parentheses around && within ||(较为少见)

原因:有人这么用了

if(( *p >= 'a' ) && ( *p <= 'z' ) || ( *p >= 'A' ) && ( *p <= 'Z' ) || ( *p >= '0' ) && ( *p <= '9' ))

方法:

if((( *p >= 'a' ) && ( *p <= 'z' )) || (( *p >= 'A' ) && ( *p <= 'Z' )) || (( *p >= '0' ) && ( *p <= '9' )))

本文遵守协议

如有征用请标明出处

欢迎提问于浏览

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值