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

  • Post author:
  • Post category:其他




仅代表个人看法



如有侵权请联系删除

在用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’ )))

本文遵守协议

如有征用请标明出处

欢迎提问于浏览



版权声明:本文为zjx06136原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。