【发布时间】:2018-12-13 21:29:02
【问题描述】:
这是我在分析大型代码库时的观察。这是示例代码
/*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 */
}
这是代码审查员 cmets
根据编码标准,我们应该使用 MACRO 而不是数值 有时我们可能会使用
=而不是==。
它得到了解决
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){ }
编译器会产生一个非常有意义的错误,例如
错误:需要左值作为赋值的左操作数
但是这个
if(pBearer.data.recv.rat_recv = DB_RAT_GERAN) { }
干脆走开。
建议使用以上两项中的哪一项,甚至更好的技术,并且 C 标准所说的相同,即 MACRO 应在检查中比较运算符的 LHS 或 RHS 侧使用?
【问题讨论】:
-
如果宏包含变量,则无济于事。
-
yes true @Jean-FrançoisFabre 在我的例子中,宏
DB_RAT_GERAN是一个整数常量,如0x01。
标签: c if-statement operators preprocessor