<分区>
这是我在分析大型代码库时的观察结果。这是示例代码
/*comparing received RAT(it may be 2G/3G/4G) Type from ip packet with numeric value */
if(pBearer.data.recv.rat_recv == 1)
{
rrc.send_conn.rat_type = MY_GERAN; /* setting RAT as GERAN(enumerated value) i.e 2G */
/* further processing of packet */
}
这是代码审阅者的评论
As per coding standard, we should use MACRO instead of numeric value as some time we may use
=
instead of==
.
它被解析为
if(pBearer.data.recv.rat_recv == DB_RAT_GERAN) /* DB_RAT_GERAN is a macro defined somewhere in header file */
{
rrc.send_conn.rat_type = MY_GERAN; /* setting RAT as GERAN i.e 2G */
/* further processing of packet */
}
这是正确的,因为有时人们可能会错误地使用 =
而不是 ==
喜欢
if(pBearer.data.recv.rat_recv = 1) { /* always set RAT as 2G */ }
并且编译器不会产生任何警告(好的编译器,可能是,但几乎没有人分析 make
或 build
结果直到它崩溃)或相同的错误 & 它会产生问题。
现在我有古玩了,可以像这样使用
if(DB_RAT_GERAN == pBearer.data.recv.rat_recv)
而不是
if(pBearer.data.recv.rat_recv == DB_RAT_GERAN)
我更喜欢在比较运算符的左侧 上使用 MACRO 而不是右侧,因为在最坏的情况下,如果错误地使用 =
用于代替 ==
如下图
if(DB_RAT_GERAN = pBearer.data.recv.rat_recv){ }
编译器产生一个非常有意义的错误,例如
error: lvalue required as left operand of assignment
但是这个
if(pBearer.data.recv.rat_recv = DB_RAT_GERAN) { }
简单地离开。
建议使用以上两者中的哪一个或更好的技术并做任何事情C
标准说的差不多,即 MACRO 应该在检查中的比较运算符的 LHS 或 RHS 端使用?