这是我的代码库的一部分...
因为在MACRO调用中缩进/分组变量以避免lint警告是令人困惑的
代码:
enum baseId{
ADDRESS_ID = 0,
ML_ID
};
struct strAddress{
uint8 Address[6];
};
struct strCam{
FLOAT currXmm;
FLOAT currYmm;
};
#define SET_RECORD(recordid, bufferptr, type) { \
RecordReturnType status; \
RecordManager<type> sampleRecord; \
validate(bufferptr != NULL); \
status = sampleRecord.SetRecord(recordid, *(type *) (const_cast<void *>(bufferptr))\
); \
validate(status == E_OK); \
}
bool fun(const uint8 *diagData){
bool ret ;
strAddress tempMac;
memcpy(tempMac.Address, diagData,sizeof(strAddress));
SET_RECORD((uint32)ADDRESS_ID,(const void *) &tempMac,strAddress); //line
ret = TRUE;
}
Warning 665: Unparenthesized parameter 2 in macro 'SET_RECORD' is passed an expression
评论//线是这个警告出现的地方caz ...我尝试以不同的方式对第二个变量进行括号,但仍然警告仍然存在......
答案 0 :(得分:3)
显然,Lint警告你宏的第4行,validate(bufferptr != NULL);
。如果bufferptr
绑定到包含优先级低于!=
的运算符的表达式,则宏将扩展为您可能不期望的值:
SET_RECORD(x, condition ? thisbuf : thatbuf, y)
扩展为:validate(condition ? thisbuf : thatbuf != NULL);
,表示validate(condition ? thisbuf : (thatbuf != NULL));
。
重写这一行:validate((bufferptr) != NULL);
。
答案 1 :(得分:0)
每次在宏中使用时,都会通过括号括起宏参数以避免此类问题:https://servicios.excentia.es/sonar-demo/rules/show/pclint:665?layout=true