完美解决消除多种 warning(基于VxWorks7.0)适用C开发
方式1:直接忽略警告
注:(此方式弊端是在软件审核时会降低等级或者无法通过)
打开项目属性添加如下:(作用是忽略掉这些代号的警告)
-ei4177,4301,4550 -ei4177,4550,2273,5387,5388,1546,1824 -ei4111,4171,4188,4191,4513,5457
方式2:逐个消除警告
警告1:line 15: warning (etoa:4068): integer conversion resulted in a change of sign “CHK_PTR_RTN1(buf->_buf);”
先找到宏定义及buf->_buf类型
#define CHK_PTR_RTN(expr)\
if( (expr) == 0 ) \
{\
return REDS_ERROR_INVALID_ARGS;\
}
typedef struct _SerialBuf
{
char * _buf;
int _size;
int _pos;
int _dataSize;
int _created;
}SerialBuf;
SerialBuf *buf;
#define REDS_ERROR_INVALID_ARGS 0xFF000005
所以此处buf->_buf是char*类型;指针需要和null比较;又因为宏REDS_ERROR_INVALID_ARGS 大于int范围不能直接强转否则就会出现负值导致逻辑出错;修解决方法:
#define CHK_PTR_RTN(expr)\
if( (expr) == NULL ) \
{\
int temp;\
* (unsigned int*) &temp = REDS_ERROR_INVALID_ARGS;\
return temp;\
}
注:如果是short int long 类型小转大直接转换,大转小可能丢失精度。
警告2:warning (etoa:4188): enumerated type mixed with another type
result = FltTest_FltTrig(evtCount);
找FltTest_FltTrig定义发现需要枚举类型但是给的是int型
int evtCount = 0;
int FltTest_FltTrig(E_EVT_TYPE evtType);
typedef enum _EVT_TYPE_DEF
{
eEVTTYPE_COMMON = 0, /*通用事件和故障*/
//eEVTTYPE_SYSENT = 1, /*系统事件*/
eEVTTYPE_ALL = 1 /*所有故障和事件,也表示类型的个数,必须放在最后*/
}E_EVT_TYPE;
解决方法(强制转换):
FltTest_FltTrig((E_EVT_TYPE)evtCount);
警告3:warning (etoa:4513): a value of type "unsigned char *" cannot be assigned to an entity of type "char *"
if((ctxNode->_evtCtx = (unsigned char *)malloc(ctxLen)) == NULL)
解决方法:
if((ctxNode->_evtCtx = (char *)malloc(ctxLen)) == NULL)
警告4:warning (etoa:4177): variable "result" was declared but never referenced
解决方法:
直接删除或者注释掉即可;只定义没使用://int result = 0;
警告5:warning (etoa:4940): missing return statement at end of non-void function "T_PrintEvtRcdQueue"
解决方法:
函数最后加上return 0;
警告6:warning (etoa:4014): extra text after expected end of preprocessing directive
#ifdef defined(INCLUDE_LONG_WORKS_MODULE)
此处是正确的报警告和编译器有关,详细如下:
#if的后面接的是表达式,如果表达式为1,则编译#if下面的代码
#if (MAX==10)||(MAX==20)
...code...
#endif
它的作用是:如果(MAX==10)||(MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!)
#ifdef 的说明
#ifdef 后面接的是一个宏
#ifdef (x)
...code...
#endif
这个#ifdef 它不管里面的“x”的逻辑是“真”还是“假”,它只管这个程序前面的宏定义里面有没有定义“x”这个宏(即在这里#define x 1和#define x 0等效,都等同于#define x)。
如果定义了x这个宏,那么编译器会编译中间的…code…否则直接忽视中间的…code…代码。
#if defined的使用
#if defined() 的使用和#ifdef的用法一致
#if !defined()又和 #ifndef 的用法一致。
最后强调两点:
第一:这几个宏定义只是决定代码块是否被编译!
第二:别忘了#endif
解决方法:换一种方式:
#ifdef INCLUDE_LONG_WORKS_MODULE
case E_LONG_WORKS:
#endif
警告7:warning (etoa:4111): statement is unreachable
case eAIO_1: return Aio1BrdMgrUnitInit(ioMgrUnit); break;
解决方法:直接删掉或者注释掉
警告8:warning (etoa:4186): pointless comparison of unsigned integer with zero if(addr < 0 || addr > NVSRAM_MAX_MEMORY)
解决方法:强转
if((int)addr < 0 || addr > NVSRAM_MAX_MEMORY)
警告9:warning (etoa:4513): a value of type "char *" cannot be assigned to an entity of type "uChar *"
var._value = value;
解决方法:强转
var._value = (uChar *)value;
警告10:warning (etoa:4870): invalid multibyte character sequence printf("测试加载模块: %s\n", TEST_LOAD_MODULE_NAME);
解决方法:(冒号中文问题)
printf("测试加载模块:%s\n", TEST_LOAD_MODULE_NAME);