完美解决消除多种 warning(基于VxWorks7.0)适用C开发

完美解决消除多种 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值