仅代表个人看法
如有侵权请联系删除
在用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’ )))
本文遵守协议
如有征用请标明出处
欢迎提问于浏览